পাইথনের সাথে দীর্ঘকালীন যে কেউ ঝুঁকছেন তাকে নিম্নলিখিত ইস্যু দ্বারা কামড় (বা টুকরো টুকরো টুকরো) করা হয়েছে:
def foo(a=[]):
a.append(5)
return a
পাইথন অনভিজ্ঞ এই ফাংশন সবসময় শুধুমাত্র একটি উপাদান সঙ্গে একটি তালিকা ফিরতে আশা: [5]
। পরিবর্তে ফলাফলটি খুব আলাদা এবং খুব আশ্চর্যজনক (এক নবজাতকের জন্য):
>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
>>> foo()
আমার একজন পরিচালক একবার এই বৈশিষ্ট্যের সাথে তার প্রথম মুখোমুখি হয়েছিলেন এবং এটিকে ভাষার "নাটকীয় নকশার ত্রুটি" বলেছিলেন। আমি উত্তর দিয়েছিলাম যে আচরণটির অন্তর্নিহিত ব্যাখ্যা ছিল এবং আপনি অভ্যন্তরীণগুলি বুঝতে না পারলে এটি সত্যিই খুব চমকপ্রদ এবং অপ্রত্যাশিত। যাইহোক, আমি নিম্নলিখিত প্রশ্নের উত্তর (নিজের কাছে) দিতে সক্ষম হইনি: ফাংশন সংজ্ঞাতে ফাংশন নির্বাহে নয়, ডিফল্ট যুক্তিটি আবদ্ধ করার কারণ কী? আমি সন্দেহ করি অভিজ্ঞ আচরণটির ব্যবহারিক ব্যবহার রয়েছে (কে বাগের প্রজনন ছাড়াই সত্যিকার অর্থে স্ট্যাটিক ভেরিয়েবল ব্যবহার করেছেন?)
সম্পাদনা করুন :
বাজাক একটি আকর্ষণীয় উদাহরণ তৈরি করেছেন। আপনার বেশিরভাগ মন্তব্য এবং বিশেষত উত্সালের সাথে একসাথে আমি আরও বিশদভাবে জানিয়েছি:
>>> def a():
... print("a executed")
... return []
...
>>>
>>> def b(x=a()):
... x.append(5)
... print(x)
...
a executed
>>> b()
[5]
>>> b()
[5, 5]
আমার কাছে, মনে হয় ডিজাইনের সিদ্ধান্তটি যেখানে প্যারামিটারগুলির সুযোগ রাখবে তার সাথে সম্পর্কিত: ফাংশনের ভিতরে বা এটির সাথে "একসাথে"?
ফাংশনের অভ্যন্তরে বাইন্ডিং করার অর্থ x
হ'ল কার্যকরভাবে নির্দিষ্ট ডিফল্টের সাথে আবদ্ধ যখন ফাংশন বলা হয়, সংজ্ঞায়িত হয় না এমন কিছু যা গভীর ত্রুটি উপস্থাপন করে: def
লাইনটি "হাইব্রিড" অর্থে যে বাঁধাইয়ের অংশটি হবে (এর ফাংশন অবজেক্ট) সংজ্ঞা, এবং অংশ (ডিফল্ট পরামিতিগুলির অ্যাসাইনমেন্ট) এ ফাংশন অনুরোধের সময় ঘটবে।
আসল আচরণটি আরও সামঞ্জস্যপূর্ণ: ফাংশন সংজ্ঞা অনুসারে, সেই লাইনটি কার্যকর করা হলে সেই লাইনের সমস্ত কিছুই মূল্যায়িত হয়।
[5]
।" আমি একজন পাইথন নবাগত, এবং আমি এটির আশা করব না, কারণ স্পষ্টতই foo([1])
ফিরে আসবে [1, 5]
, না [5]
। আপনি যা বলতে চেয়েছেন তা হ'ল কোনও নবজাতক আশা করে যে কোনও প্যারামিটার না দিয়ে ডাকা ফাংশনটি সর্বদা ফিরে আসবে [5]
।