Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah Pemahaman Senarai Python 2 Mengikat Semula Pembolehubah, dan Bagaimana Python 3 Mengubah Ini?

Mengapakah Pemahaman Senarai Python 2 Mengikat Semula Pembolehubah, dan Bagaimana Python 3 Mengubah Ini?

DDD
DDDasal
2024-11-30 11:51:10811semak imbas

Why Does Python 2's List Comprehension Rebind Variables, and How Did Python 3 Change This?

Pemahaman Senarai dan Pengikat Semula Nama

Pemahaman senarai ialah sintaks ringkas untuk mencipta senarai dalam Python. Walau bagaimanapun, mereka menunjukkan tingkah laku yang tidak dijangka dalam interaksi dengan skop.

Pertimbangkan kod berikut:

x = "original value"
squares = [x**2 for x in range(5)]
print(x)  # Prints 4 in Python 2!

Dalam contoh ini, pemahaman senarai mengikat semula pembolehubah x kepada nilai semasa daripada lelaran julat(5). Tingkah laku ini dikenali sebagai pengikatan semula nama.

Sebab Pengikat Semula Nama

Dalam Python 2, pemahaman senarai dilaksanakan secara berbeza daripada ungkapan penjana. Pemahaman senarai telah dioptimumkan untuk kelajuan dengan membocorkan pembolehubah kawalan gelung ke dalam skop sekeliling. Ekspresi penjana, sebaliknya, menggunakan bingkai pelaksanaan yang berasingan, menghalang kebocoran ini.

Perubahan Python 3

Dalam Python 3, perbezaan ini telah dialih keluar. Senarai pemahaman kini menggunakan pelaksanaan yang sama seperti ungkapan penjana. Akibatnya, penjilidan semula nama tidak lagi berlaku dalam Python 3.

Akibat

Penikatan semula nama boleh membawa kepada tingkah laku dan ralat yang tidak dijangka, terutamanya dalam kes di mana nama pembolehubah yang sama digunakan dalam kedua-dua pemahaman senarai dan skop sekeliling. Seperti yang dinyatakan dalam soalan, ia boleh dikurangkan dengan menggunakan awalan garis bawah untuk pembolehubah sementara dalam pemahaman senarai.

Guido van Rossum, pencipta Python, menjelaskan sejarah di sebalik perubahan ini: Dalam Python 2, pemahaman senarai bocor pembolehubah kawalan gelung sebagai artifak pelaksanaan awal untuk mengoptimumkan prestasi. Walau bagaimanapun, dalam Python 3, ini dianggap sebagai rahsia kecil yang kotor yang harus diperbaiki dengan menggunakan strategi pelaksanaan yang sama seperti ungkapan penjana.

Atas ialah kandungan terperinci Mengapakah Pemahaman Senarai Python 2 Mengikat Semula Pembolehubah, dan Bagaimana Python 3 Mengubah Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn