যদিও অনেক সময় পেরিয়ে গেছে এবং অনেকগুলি সঠিক কথা বলা হয়েছিল, এর কোনও উত্তর নেই যা উভয় প্রভাবকেই বান্ডিল করে।
আপনার 2 টি প্রভাব রয়েছে:
- একটি "বিশেষ", সম্ভবত তালিকার অলক্ষিত আচরণ
+=
( স্কট গ্রিফিথস দ্বারা বর্ণিত হিসাবে )
- শ্রেণীর বৈশিষ্ট্যগুলির পাশাপাশি উদাহরণের বৈশিষ্ট্যগুলি জড়িত রয়েছে ( ক্যান বার্ক বেডার দ্বারা বর্ণিত )
ক্লাসে foo
, __init__
পদ্ধতিটি শ্রেণীর বৈশিষ্ট্য পরিবর্তন করে। এটি self.bar += [x]
অনুবাদ কারণ self.bar = self.bar.__iadd__([x])
। __iadd__()
অন্তর্নিহিত পরিবর্তনের জন্য, সুতরাং এটি তালিকাটি পরিবর্তন করে এবং এটিতে একটি রেফারেন্স দেয়।
নোট করুন যে ইনস্ট্যান্ট ডিকটি সংশোধিত হয়েছে যদিও এটি সাধারণত প্রয়োজন হবে না কারণ শ্রেণি ডিকটিতে ইতিমধ্যে একই কাজ রয়েছে। সুতরাং এই বিবরণটি প্রায় অলক্ষিত হয় - আপনি যদি foo.bar = []
পরে কিছু না করেন তবে । এখানে দৃষ্টান্তগুলির bar
অনুরূপ তথ্যের জন্য একই ধন্যবাদ রয়েছে।
ক্লাসে foo2
, তবে, শ্রেণীর bar
ব্যবহৃত হয়, কিন্তু ছোঁয়া হয় না। পরিবর্তে, [x]
এটিকে যুক্ত করা হয়, একটি নতুন অবজেক্ট তৈরি করে, যেমন self.bar.__add__([x])
এখানে বলা হয়, যা বস্তুকে পরিবর্তন করে না। ফলাফলটি তখন উদাহরণস্বরূপ ডকের মধ্যে রাখা হয়, উদাহরণটিকে ডিক হিসাবে নতুন তালিকা প্রদান করে, যখন শ্রেণীর বৈশিষ্ট্যটি পরিবর্তিত থাকে।
এর মধ্যে পার্থক্য ... = ... + ...
এবং ... += ...
পরবর্তী কাজগুলি পাশাপাশি প্রভাবিত করে:
f = foo(1) # adds 1 to the class's bar and assigns f.bar to this as well.
g = foo(2) # adds 2 to the class's bar and assigns g.bar to this as well.
# Here, foo.bar, f.bar and g.bar refer to the same object.
print f.bar # [1, 2]
print g.bar # [1, 2]
f.bar += [3] # adds 3 to this object
print f.bar # As these still refer to the same object,
print g.bar # the output is the same.
f.bar = f.bar + [4] # Construct a new list with the values of the old ones, 4 appended.
print f.bar # Print the new one
print g.bar # Print the old one.
f = foo2(1) # Here a new list is created on every call.
g = foo2(2)
print f.bar # So these all obly have one element.
print g.bar
আপনি অবজেক্টগুলির পরিচয় যাচাই করতে পারবেন print id(foo), id(f), id(g)
( ()
যদি আপনি পাইথন 3 এ থাকেন তবে অতিরিক্তগুলি ভুলে যাবেন না )।
বিটিডাব্লু: +=
অপারেটরটিকে "অগমেন্টেড অ্যাসাইনমেন্ট" বলা হয় এবং সাধারণত যতদূর সম্ভব ইনপ্লেস পরিবর্তনগুলি করা যায়।