"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 a
bir 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 += 1
bir tamsayı için i
yerinde ç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 += y
aş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ç NotImplemented
singleton 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_tuple
Python 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 t
olacaktır ([42, 44], [43])
.