আসুন প্রশ্নটি সহজ করুন। নির্ধারণ:
def get_petters():
for animal in ['cow', 'dog', 'cat']:
def pet_function():
return "Mary pets the " + animal + "."
yield (animal, pet_function)
তারপরে, ঠিক যেমন প্রশ্নের মতো আমরা পেয়েছি:
>>> for name, f in list(get_petters()):
... print(name + ":", f())
cow: Mary pets the cat.
dog: Mary pets the cat.
cat: Mary pets the cat.
তবে আমরা যদি list()
প্রথমটি তৈরি করা এড়িয়ে চলি :
>>> for name, f in get_petters():
... print(name + ":", f())
cow: Mary pets the cow.
dog: Mary pets the dog.
cat: Mary pets the cat.
কি হচ্ছে? কেন এই সূক্ষ্ম পার্থক্য সম্পূর্ণভাবে আমাদের ফলাফল পরিবর্তন করে?
আমরা যদি দেখি list(get_petters())
, পরিবর্তিত মেমরি ঠিকানাগুলি থেকে এটি পরিষ্কার যে আমরা প্রকৃতপক্ষে তিনটি পৃথক ফাংশন পাই:
>>> list(get_petters())
[('cow', <function get_petters.<locals>.pet_function at 0x7ff2b988d790>),
('dog', <function get_petters.<locals>.pet_function at 0x7ff2c18f51f0>),
('cat', <function get_petters.<locals>.pet_function at 0x7ff2c14a9f70>)]
যাইহোক, cell
এই ফাংশনগুলি যে সীমাবদ্ধ তা একবার দেখুন:
>>> for _, f in list(get_petters()):
... print(f(), f.__closure__)
Mary pets the cat. (<cell at 0x7ff2c112a9d0: str object at 0x7ff2c3f437f0>,)
Mary pets the cat. (<cell at 0x7ff2c112a9d0: str object at 0x7ff2c3f437f0>,)
Mary pets the cat. (<cell at 0x7ff2c112a9d0: str object at 0x7ff2c3f437f0>,)
>>> for _, f in get_petters():
... print(f(), f.__closure__)
Mary pets the cow. (<cell at 0x7ff2b86b5d00: str object at 0x7ff2c1a95670>,)
Mary pets the dog. (<cell at 0x7ff2b86b5d00: str object at 0x7ff2c1a952f0>,)
Mary pets the cat. (<cell at 0x7ff2b86b5d00: str object at 0x7ff2c3f437f0>,)
উভয় লুপের জন্য, cell
পুনরাবৃত্তিগুলির মধ্যে অবজেক্টটি একই থাকে। তবে, যেমনটি প্রত্যাশা করা হয়েছে, সুনির্দিষ্টভাবে str
উল্লেখ করা হয়েছে এটি দ্বিতীয় লুপে পরিবর্তিত হয়। cell
বস্তু বোঝায় animal
, যা যখন তৈরি করা হয় get_petters()
বলা হয়। যাইহোক, জেনারেটর ফাংশন চলমান হিসাবে এটি animal
কোন str
বস্তুকে বোঝায় তা পরিবর্তন করে ।
প্রথম লুপে, প্রতিটি পুনরাবৃত্তির সময়, আমরা সমস্ত f
গুলি তৈরি করি , তবে জেনারেটর get_petters()
সম্পূর্ণ নিঃশেষ হয়ে যাওয়ার পরে এবং list
ফাংশনগুলির একটি ইতিমধ্যে তৈরি হওয়ার পরে আমরা কেবল তাদের কল করি ।
দ্বিতীয় লুপে, প্রতিটি পুনরাবৃত্তির সময় আমরা get_petters()
জেনারেটরকে f
বিরতি দিচ্ছি এবং প্রতিটি বিরামের পরে কল করছি । সুতরাং, আমরা animal
জেনারেটর ফাংশন বিরতি দেওয়া হয়েছে যে মুহুর্তে মান পুনরুদ্ধার শেষ ।
@ ক্লাডিউ যেমন একটি অনুরূপ প্রশ্নের উত্তর দিয়েছেন :
তিনটি পৃথক ফাংশন তৈরি করা হয় তবে তাদের প্রত্যেকটির পরিবেশ নির্ধারিত পরিবেশ বন্ধ হয়ে যায় - এক্ষেত্রে বৈশ্বিক পরিবেশ (বা লুপটি যদি অন্য ফাংশনের ভিতরে রাখা হয় তবে বাইরের ফাংশনের পরিবেশ)। এটি ঠিক সমস্যা, যদিও - এই পরিবেশে, animal
রূপান্তরিত হয়, এবং বন্ধগুলি সমস্ত একইটিকে বোঝায় animal
।
[সম্পাদক দ্রষ্টব্য: i
এতে পরিবর্তন করা হয়েছে animal
]]
for animal in ['cat', 'dog', 'cow']
... আমি নিশ্চিত যে কেউ