"Artırılmış" atama operatörleri +=Ekim 2000'de piyasaya sürülen Python 2.0'da tanıtıldı. Tasarım ve gerekçe PEP 203'te açıklanmaktadır . Bu operatörlerin beyan edilen hedeflerinden biri yerinde operasyonların desteklenmesiydi. yazı
a = [1, 2, 3]
a += [4, 5, 6]
listesinin a yerinde güncellenmesi gerekiyor . Bu, listeye başka referanslar olup olmadığı a, örneğin abir işlev bağımsız değişkeni olarak alındığında önemlidir .
Ancak, tamsayılar ve dizgiler de dahil olmak üzere birçok Python türü değişmez olduğundan , işlem her zaman gerçekleşemez, bu nedenle örneğin i += 1bir tamsayı için iyerinde çalışamaz.
Özetle, artırılmış atama operatörlerinin mümkünse yerinde çalışması ve aksi takdirde yeni bir nesne yaratması gerekiyordu. Bu tasarım hedeflerini kolaylaştırmak için, ifadenin x += yaşağıdaki gibi davranacağı belirtildi:
- Eğer
x.__iadd__tanımlanır, x.__iadd__(y)değerlendirilir.
- Aksi takdirde,
x.__add__uygulanırsa x.__add__(y)değerlendirilir.
- Aksi takdirde,
y.__radd__uygulanırsa y.__radd__(x)değerlendirilir.
- Aksi takdirde bir hata oluşturun.
Bu işlemle elde edilen ilk sonuç geri atanacaktır x(bu sonuç NotImplementedsingleton değilse, bu durumda arama bir sonraki adımla devam eder).
Bu işlem, yerinde modifikasyonu destekleyen türlerin uygulanmasına izin verir __iadd__(). Türleri yok yerinde değişiklik desteklemek Python otomatik esasen geri düşecek çünkü herhangi bir yeni sihirli yöntemleri eklemek gerekmez x = x + y.
Nihayet asıl sorunuza gelelim - neden artırılmış bir atama operatörü ile bir listeye bir demet ekleyebilirsiniz? Bellekten, bunun geçmişi kabaca şöyleydi: Yöntem Python 2.0'da list.__iadd__()zaten var olan list.extend()yöntemi çağırmak için uygulandı . Yineleyiciler Python 2.1'de tanıtıldığında, list.extend()yöntem rasgele yineleyicileri kabul edecek şekilde güncellendi. Bu değişikliklerin sonucu my_list += my_tuplePython 2.1'den başlayarak çalışıldı. list.__add__()Ancak bu usul, sağ argüman olarak keyfi yineleyicinızı desteklemek gerekiyordu asla - bu kesinlikle yazılı dil için uygun bulunmamıştır.
Kişisel olarak, artırılmış operatörlerin uygulanmasının Python'da biraz fazla karmaşık olduğunu düşünüyorum. Birçok şaşırtıcı yan etkisi vardır, örneğin bu kod:
t = ([42], [43])
t[0] += [44]
İkinci satır yükselir TypeError: 'tuple' object does not support item assignment, ancak işlem yine de başarıyla gerçekleştirilir - hatayı yükselten satır yürütüldükten sonra tolacaktır ([42, 44], [43]).