এটি পুরোপুরি অবজেক্টের উপর নির্ভর করে i
।
+=
কল __iadd__
পদ্ধতি (এটা যদি উপস্থিত থাকে - ফিরে পতনশীল __add__
যদি এটা কোন অস্তিত্ব নেই) যেহেতু +
কল __add__
পদ্ধতি 1 বা __radd__
কয়েক ক্ষেত্রেই পদ্ধতি 2 ।
একটি এপিআই দৃষ্টিকোণ থেকে, স্থান__iadd__
পরিবর্তনযোগ্য বস্তু পরিবর্তনের জন্য ব্যবহৃত হবে বলে মনে করা হচ্ছে (যে বস্তুটি রূপান্তরিত হয়েছিল তা ফেরত দেওয়া হয়েছে ) তবে কোনও কিছুর একটি নতুন উদাহরণ ফিরে আসা উচিত । জন্য অপরিবর্তনীয় বস্তু, উভয় পদ্ধতি একটি নতুন দৃষ্টান্ত আসতে, কিন্তু একই নামের পুরানো দৃষ্টান্ত ছিল বর্তমান নামস্থান নতুন দৃষ্টান্ত করবে। এই জন্যই__add__
__iadd__
i = 1
i += 1
বর্ধিত বলে মনে হচ্ছে i
। বাস্তবে, আপনি একটি নতুন পূর্ণসংখ্যা পেয়েছেন এবং এটিকে "শীর্ষে" অর্পণ করুন i
- পুরানো পূর্ণসংখ্যার একটি উল্লেখ হারিয়ে ফেলে। এই ক্ষেত্রে, i += 1
ঠিক হিসাবে একই i = i + 1
। তবে বেশিরভাগ পরিবর্তনযোগ্য বস্তুর সাথে এটি একটি ভিন্ন গল্প:
একটি দৃ concrete় উদাহরণ হিসাবে:
a = [1, 2, 3]
b = a
b += [1, 2, 3]
print a #[1, 2, 3, 1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]
তুলনা করা:
a = [1, 2, 3]
b = a
b = b + [1, 2, 3]
print a #[1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]
নোটিশ কিভাবে প্রথম উদাহরণে, যেহেতু b
এবং a
রেফারেন্স একই বস্তুর যখন আমি ব্যবহার +=
উপর b
, এটি একটি প্রকৃত পরিবর্তন b
(এবং a
তাও পরিবর্তন সূচিত - সব পরে, এটি একই তালিকা উল্লেখ করা হয়েছে)। তবে দ্বিতীয় ক্ষেত্রে, যখন আমি এটি করি b = b + [1, 2, 3]
, এটি সেই তালিকাটি b
রেফারেন্স করছে এবং এটি একটি নতুন তালিকার সাথে যুক্ত করে [1, 2, 3]
। এরপরে এটি বর্তমান নামস্থানে সংক্ষিপ্ত তালিকাটি সংরক্ষণ করে b
- এর b
আগে লাইনটি কী ছিল তা বিবেচনা ছাড়াই ।
1 এক্সপ্রেশনে x + y
, যদি x.__add__
বাস্তবায়িত হয়নি অথবা যদি x.__add__(y)
আয় NotImplemented
এবং x
এবং y
বিভিন্ন ধরনের আছে , তারপর x + y
কল করার চেষ্টা করে y.__radd__(x)
। সুতরাং, আপনার যেখানে আছে
foo_instance += bar_instance
যদি Foo
বাস্তবায়ন না হয় __add__
বা __iadd__
তারপরে ফলাফল এখানে একই রকম
foo_instance = bar_instance.__radd__(bar_instance, foo_instance)
2 এক্সপ্রেশনে foo_instance + bar_instance
, bar_instance.__radd__
বিচার হবে সামনে foo_instance.__add__
যদি ধরণ bar_instance
ধরণ একটি উপশ্রেণী হয় foo_instance
(যেমন issubclass(Bar, Foo)
)। এই জন্য মূলদ কারণ Bar
একটি "উচ্চ স্তরের" বস্তু চেয়ে কিছু অর্থে হয় Foo
তাই Bar
অগ্রাহ্য করার বিকল্প পাওয়া উচিত Foo
'র আচরণ।
+=
extend()
তালিকার ক্ষেত্রে যেমন কাজ করে ।