Fungsi exec mempamerkan gelagat yang berbeza antara Python 2 dan Python 3. Dalam Python 2, exec ialah pernyataan, manakala dalam Python 3, ia telah beralih kepada fungsi. Perbezaan ini mempunyai implikasi yang ketara untuk interaksinya dengan pembolehubah tempatan.
Dalam Python 2, pernyataan exec membenarkan pengubahsuaian pembolehubah tempatan dalam skop fungsi. Apabila pernyataan exec dilaksanakan, pengkompil Python melumpuhkan sementara pengoptimuman skop tempatan dan beralih kepada strategi carian yang lebih perlahan untuk mengakses kedua-dua pembolehubah tempatan dan global. Selain itu, sebarang pembolehubah yang diisytiharkan dalam penyata exec akan disalin semula secara automatik ke locals fungsi jika tiada parameter global dan locals eksplisit disediakan.
Dalam Python 3, exec() fungsi mematuhi peraturan skop fungsi dengan ketat. Ia tidak lagi boleh mengubah suai pembolehubah dalam skop tempatan sesuatu fungsi, walaupun ia telah diisytiharkan sebelum ini. Locals() mampu mencerminkan pembolehubah setempat dalam satu arah, tetapi membenarkan pengubahsuaian melalui locals() tidak pernah disokong.
Untuk mencapai tingkah laku yang diingini yang diperhatikan dalam Python 2, ia adalah perlu untuk menggunakan ruang nama yang berasingan apabila memanggil exec() dalam Python 3. Dengan menghantar kamus tersuai ke fungsi exec(), ia adalah mungkin untuk mengubah suai dan akses pembolehubah dalam ruang nama itu.
Kod berikut menunjukkan cara yang betul untuk menggunakan exec() dalam Python 3:
def execute(a, st): namespace = {} exec("b = {}\nprint('b:', b)".format(st), namespace) print(namespace['b'])
Pendekatan ini memastikan bahawa skop tempatan fungsi itu kekal utuh, sementara masih membenarkan pengubahsuaian pada pembolehubah dalam ruang nama yang ditentukan.
Atas ialah kandungan terperinci Bagaimanakah fungsi `exec` berkelakuan berbeza dalam Python 2 dan Python 3?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!