Mengapa Skop Fungsi Lambda Mempengaruhi Outputnya dalam Python?

Barbara Streisand
Lepaskan: 2024-10-19 17:26:30
asal
944 orang telah melayarinya

Why Does the Scope of Lambda Functions Impact Their Output in Python?

Skop Fungsi Lambda dan Parameternya

Dalam Python, fungsi lambda menyediakan tatatanda singkatan untuk mentakrifkan fungsi sebaris. Walau bagaimanapun, skop dan pengendalian parameter mereka boleh membawa kepada tingkah laku yang tidak dijangka, seperti yang ditunjukkan oleh kod berikut:

def callback(msg):
    print msg

# Iterative Approach
funcList = []
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))
for f in funcList:
    f()

# Individual Creation
funcList = []
funcList.append(lambda: callback('do'))
funcList.append(lambda: callback('re'))
funcList.append(lambda: callback('mi'))
for f in funcList:
    f()
Salin selepas log masuk

Output yang dijangkakan ialah:

do
re
mi
do
re
mi
Salin selepas log masuk
Salin selepas log masuk

Walau bagaimanapun, output sebenar ialah:

mi
mi
mi
do
re
mi
Salin selepas log masuk

Tingkah laku ini berpunca daripada fakta bahawa fungsi lambda tidak mencipta salinan pembolehubah daripada skop yang disertakan. Sebaliknya, mereka mengekalkan rujukan kepada pembolehubah tersebut. Akibatnya, perubahan pada nilai m dalam gelung mempengaruhi semua fungsi lambda yang dibuat dalam gelung itu.

Untuk menyelesaikan isu ini, adalah amalan biasa untuk menangkap nilai m pada masa penciptaan fungsi lambda dengan menggunakannya sebagai hujah lalai bagi parameter pilihan:

for m in ('do', 're', 'mi'):
    funcList.append(lambda m=m: callback(m))
Salin selepas log masuk

Ini memastikan setiap fungsi lambda menangkap nilai m yang betul, menghasilkan output yang diingini:

do
re
mi
do
re
mi
Salin selepas log masuk
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Skop Fungsi Lambda Mempengaruhi Outputnya dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!