පයිතන් සමඟ දිගින් දිගට කතා කරන ඕනෑම කෙනෙකුට පහත සඳහන් නිකුතුවෙන් දෂ්ට කර ඇත (හෝ කැබලිවලට ඉරා ඇත):
def foo(a=[]):
a.append(5)
return a
පයිතන් සාමනේරයන් මෙම ශ්රිතය සෑම විටම එක් මූලද්රව්යයක් සහිත ලැයිස්තුවක් නැවත ලබා දෙනු ඇතැයි අපේක්ෂා කරයි : [5]
. ප්රති result ලය ඒ වෙනුවට බෙහෙවින් වෙනස් ය, පුදුම සහගත ය (නවකයකු සඳහා):
>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
>>> foo()
මගේ කළමණාකරුවෙක් වරක් මෙම අංගය සමඟ පළමු වරට මුණගැසුණු අතර එය භාෂාවේ “නාට්යමය නිර්මාණ දෝෂයක්” ලෙස හැඳින්වීය. මම පිළිතුරු දුන්නේ හැසිරීමට යටින් පැහැදිලි කිරීමක් ඇති අතර, ඔබ අභ්යන්තරය තේරුම් නොගන්නේ නම් එය ඇත්තෙන්ම ප්රහේලිකාවක් සහ අනපේක්ෂිත දෙයක් බවයි. කෙසේ වෙතත්, මට පහත සඳහන් ප්රශ්නයට පිළිතුරු දීමට නොහැකි විය: පෙරනිමි තර්කය ශ්රිත අර්ථ දැක්වීමේදී බන්ධනය කිරීමට හේතුව කුමක්ද? පළපුරුදු හැසිරීමට ප්රායෝගික භාවිතයක් ඇතැයි මට සැකයි (දෝෂ බෝ නොකර C හි ස්ථිතික විචල්යයන් සැබවින්ම භාවිතා කළේ කවුද?)
සංස්කරණය කරන්න :
බැක්සෙක් රසවත් උදාහරණයක් ඉදිරිපත් කළේය. ඔබගේ බොහෝ අදහස් සහ විශේෂයෙන් උටාල්ගේ අදහස් සමඟ මම තවදුරටත් විස්තර කළෙමි:
>>> def a():
... print("a executed")
... return []
...
>>>
>>> def b(x=a()):
... x.append(5)
... print(x)
...
a executed
>>> b()
[5]
>>> b()
[5, 5]
මට නම්, සැලසුම් තීරණය පරාමිතීන්ගේ විෂය පථය තැබිය යුත්තේ කොතැනටද යන්නට සාපේක්ෂව බව පෙනේ: ශ්රිතය ඇතුළත හෝ ඒ සමඟ “එකට”?
ශ්රිතය තුළ බන්ධනය කිරීම යන්නෙන් අදහස් x
වන්නේ ශ්රිතය හැඳින්වූ විට නිශ්චිත පෙරනිමියට effectively ලදායී ලෙස බැඳී ඇති බවයි def
. ශ්රිත වස්තුව) අර්ථ දැක්වීමේදී සිදු වන අතර, කොටස (පෙරනිමි පරාමිතීන් පැවරීම) ශ්රිත ආයාචන වේලාවේදී සිදු වේ.
සත්ය හැසිරීම වඩාත් අනුකූල වේ: එම රේඛාව ක්රියාත්මක වන විට එම රේඛාවේ සෑම දෙයක්ම ඇගයීමට ලක් වේ.
[5]
." මම පයිතන් සාමනේරයෙක්, මම මෙය බලාපොරොත්තු නොවෙමි, මන්ද පැහැදිලිවම foo([1])
නැවත පැමිණෙනු ඇත [1, 5]
, නැත [5]
. ඔබ කීමට අදහස් කළේ නවකයකු පරාමිතියක් නොමැතිව හැඳින්වූ ශ්රිතය සැමවිටම නැවත පැමිණෙනු ඇතැයි අපේක්ෂා කරන [5]
බවයි.