Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Penutupan Leksikal Python dalam Gelung Menghasilkan Keputusan yang Tidak Dijangka?

Mengapa Penutupan Leksikal Python dalam Gelung Menghasilkan Keputusan yang Tidak Dijangka?

Patricia Arquette
Lepaskan: 2024-11-29 16:57:11
asal
120 orang telah melayarinya

Why Do Python Lexical Closures in Loops Produce Unexpected Results?

Penutupan Leksikal dalam Python: Memahami Gelagat Tidak Dijangka

Dalam Python, penutupan leksikal membenarkan fungsi dalaman mengakses pembolehubah yang ditakrifkan dalam skop yang disertakan. Walau bagaimanapun, tingkah laku yang tidak dijangka timbul apabila mentakrifkan fungsi dalam gelung yang mengubah suai pembolehubah yang dikongsi. Untuk menggambarkan ini, pertimbangkan kod Python berikut:

flist = []

for i in range(3):
    def func(x): return x * i
    flist.append(func)

for f in flist:
    print(f(2))
Salin selepas log masuk

Kod ini mencetak "4 4 4," yang mengejutkan kerana seseorang mungkin menjangkakan "0 2 4." Sebab untuk tingkah laku yang tidak dijangka ini terletak pada mekanisme penutupan. Dalam Python, fungsi yang ditakrifkan dalam gelung mencipta fungsi baharu tetapi berkongsi skop yang disertakan, yang dalam kes ini ialah skop global. Akibatnya, apabila nilai i diubah kemudiannya, semua fungsi dalam senarai merujuk kepada nilai i yang diubah suai yang sama.

Untuk menangani isu ini, seseorang perlu mencipta persekitaran unik untuk setiap fungsi dalam gelung . Ini boleh dicapai dengan menggunakan pencipta fungsi:

flist = []

for i in range(3):
    def funcC(j):
        def func(x): return x * j
        return func
    flist.append(funcC(i))

for f in flist:
    print(f(2))
Salin selepas log masuk

Dalam kod yang disemak ini, setiap panggilan ke funcC menjana persekitaran penutupan baharu dengan nilai i sendiri. Akibatnya, setiap fungsi dalam senarai mempunyai akses kepada nilai i yang berbeza, yang membawa kepada output yang dijangkakan "0 2 4."

Tingkah laku ini menekankan kepentingan memahami cara penutupan berfungsi dalam Python, terutamanya apabila menangani kesan sampingan dan pengaturcaraan berfungsi. Apabila fungsi yang ditakrifkan dalam gelung berkongsi pembolehubah yang diubah suai, tingkah laku yang tidak dijangka boleh timbul. Menggunakan pencipta fungsi membantu mewujudkan persekitaran yang unik untuk setiap fungsi dan memastikan gelagat yang diingini tercapai.

Atas ialah kandungan terperinci Mengapa Penutupan Leksikal Python dalam Gelung Menghasilkan Keputusan yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan