আসুন প্রশ্নটি সহজ করুন। নির্ধারণ:
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']... আমি নিশ্চিত যে কেউ