Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Skop Fungsi Lambda Mempengaruhi Outputnya dalam Python?

Mengapa Skop Fungsi Lambda Mempengaruhi Outputnya dalam Python?

Barbara Streisand
Barbara Streisandasal
2024-10-19 17:26:301071semak imbas

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()

Output yang dijangkakan ialah:

do
re
mi
do
re
mi

Walau bagaimanapun, output sebenar ialah:

mi
mi
mi
do
re
mi

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))

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

do
re
mi
do
re
mi

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!

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