Masalah:
Apabila menggunakan exec dalam Python 3 untuk dilaksanakan rentetan kod dalam fungsi, pembolehubah tempatan dalam fungsi tidak dikemas kini. Isu ini timbul kerana pengoptimuman Python 3 yang cekap bagi storan pembolehubah setempat.
Contoh:
def f(): a = 1 exec("a = 3") print(a) f()
Kod ini dijangka mencetak 3 tetapi sebaliknya mencetak 1.
Penyelesaian:
Untuk mengubah suai setempat pembolehubah menggunakan exec, kamus tempatan eksplisit mesti diluluskan. Ini boleh dicapai seperti berikut:
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
Penjelasan:
Python 3 menyimpan pembolehubah tempatan dalam tatasusunan untuk mengoptimumkan aksesnya. Walau bagaimanapun, tingkah laku lalai exec tidak membenarkan pengubahsuaian pembolehubah tempatan. Dengan menghantar kamus tempatan yang eksplisit, pembolehubah boleh diberikan kepada kamus dan nilai diubah suainya boleh diakses melaluinya.
Python 2 vs Python 3:
Dalam Python 2, tingkah laku ini berfungsi seperti yang diharapkan disebabkan oleh mekanisme pengoptimuman yang membenarkan fungsi dengan exec mempunyai storan pembolehubah tempatan yang tidak dioptimumkan. Walau bagaimanapun, dalam Python 3, pengoptimuman ini tidak lagi mungkin, membawa kepada gelagat yang diperhatikan.
Nota:
Adalah penting untuk diingat bahawa menghantar kamus tempatan yang eksplisit harus hanya dilakukan apabila perlu, kerana ia mengalih keluar faedah pengoptimuman yang ditawarkan oleh pengendalian lalai Python 3 bagi pembolehubah tempatan.
Atas ialah kandungan terperinci Mengapa tidak menjalankan Kemas Kini Pembolehubah Tempatan dalam Python 3, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!