Cara Pembolehubah Tempatan Tidak Boleh Dikemas Kini Terus dengan exec
Panggilan exec dalam Python ialah alat yang berkuasa untuk melaksanakan kod secara dinamik, tetapi ia datang dengan had mengenai pengubahsuaian pembolehubah tempatan.
Pertimbangkan perkara berikut kod:
def f(): a = 1 exec("a = 3") print(a) f()
Seseorang mungkin menjangkakan kod ini mencetak 3, tetapi ia sebenarnya mencetak 1. Ini kerana dalam Python 3, pembolehubah tempatan tidak disimpan dalam kamus, tetapi tatasusunan dengan indeks ditentukan semasa penyusunan masa. Fungsi exec tidak boleh mengubah suai pembolehubah tempatan dengan selamat tanpa mengganggu pengoptimuman ini.
Penyelesaian: Menggunakan Kamus Tempatan dengan exec
Untuk mengubah suai pembolehubah tempatan menggunakan exec, anda perlu untuk meluluskan kamus tempatan secara eksplisit. Contohnya:
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
Ini melaksanakan kod dalam kamus tempatan (ldict), yang berbeza daripada tatasusunan pembolehubah tempatan fungsi. Pembolehubah yang diubah suai kemudiannya boleh dikembalikan kepada skop fungsi dengan mengakses kamus tempatan.
Gelagat Python 2
Dalam Python 2, exec boleh mengubah suai pembolehubah tempatan tanpa lulus kamus eksplisit kerana ia menganggap ruang nama yang menggunakan exec tanpa hujah globals/locals sebagai "tidak dioptimumkan." Walau bagaimanapun, ini tidak berlaku dalam Python 3.
Oleh itu, adalah penting untuk diingat bahawa apabila menggunakan exec, pembolehubah tempatan hanya boleh dikemas kini dengan mencipta dan menghantar kamus tempatan untuk mengelakkan sebarang kemungkinan konflik dengan pengoptimuman pengkompil. .
Atas ialah kandungan terperinci Mengapa `exec` Tidak Boleh Kemas Kini Secara Terus Pembolehubah Tempatan dalam Python 3?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!