+ = Python'da tam olarak ne yapar?


118

Python'da + ='nin ne yaptığını bilmem gerekiyor. Bu kadar basit. Python'daki diğer kısa el aletlerinin tanımlarına olan bağlantıları da takdir ediyorum.



2
bu, python (ve diğer birçok dil) için temel bir operatördür, herhangi bir python referansını hiç okumadıysanız, google ile başlamalısınız.
technomage

3
@AndiDog Her iki soru da (+ =) operatörü ile ilgili doğru olsa da, bağladığınız soru karmaşık bir kullanım ve ince bir problemle ilgili ve buradaki OP muhtemelen oradaki mantığı takip edemiyor (henüz).
Dr. belisarius

3
@AndiDog Belki o sırada haklıydınız, ancak buradaki (neredeyse) kabul edilen çözümlere baktığınızda, bu sorunun operatörün temel bir anlayışıyla ilgili olduğu açıktır: D
Dr. belisarius

1
Sumbol kullanımlarının çoğu artık Semboller sayfasında docs.python.org/3/genindex-Symbols.html'de dizine eklenmiştir .
Terry Jan Reedy

Yanıtlar:


148

Python'da + =, __iadd__özel yöntem için __add__veya __radd__yoksa __iadd__mevcut değilse şeker kaplamadır . __iadd__Bir sınıfın yöntem istediği her şeyi yapabilir. List nesnesi onu uygular ve listenin genişleme yönteminin yaptığı gibi her öğeyi kendisine ekleyen yinelenebilir bir nesne üzerinde yineleme yapmak için kullanır.

İşte __iadd__özel yöntemi uygulayan basit bir özel sınıf . Nesneyi bir int ile başlatırsınız, ardından bir sayı eklemek için + = operatörünü kullanabilirsiniz. Çağrıldığını __iadd__göstermek için içine bir baskı ifadesi ekledim . Ayrıca, __iadd__bir nesneyi döndürmesi bekleniyor, bu yüzden kendisinin toplamasını ve bu durumda anlamlı olan diğer sayıyı döndürdüm.

>>> class Adder(object):
        def __init__(self, num=0):
            self.num = num

        def __iadd__(self, other):
            print 'in __iadd__', other
            self.num = self.num + other
            return self.num

>>> a = Adder(2)
>>> a += 3
in __iadd__ 3
>>> a
5

Bu yardımcı olur umarım.


24
Soran kişinin aradığı bu olmasa da, gerçek cevap için +1. =)
Michael

@Michael, mizahın gerçeğe katkıda bulunduğu yer burası ... :-D
Aaron John Sabu

3
Soruyu yanıtlamak için +1, ancak __iadd__farklı bir tür döndüren (kendisi eklenebilir) için -1
Caleth

Bu cevap, + = 'nin ne anlama geldiğini sorması gereken kişi için çok karmaşıktır (yani, yeni başlayanlar). Cevabınız yeni başlayanlar için bir cevap değil, sadece yeni başlayanlar genellikle Python'u nesneye dayalı bir şekilde öğrenmeye başlamadıkları için değil, aynı zamanda çok daha basit cevaplar olduğu için (@ Imran'ınki gibi). Bu cevabı takdir etmeme rağmen sadece iki sentim.
q-compute

129

+= değişkenin değeriyle başka bir değer ekler ve yeni değeri değişkene atar.

>>> x = 3
>>> x += 2
>>> print x
5

-=, *=, /=Çıkarma, çarpma ve bölme için benzer yapar.


19
Tam sayılar değişmez olduğu için burada "kendisi" aslında çok kötü bir tanımdır.
AndiDog

41

x += 5x = x + 5Python'da söylemekle tam olarak aynı değildir .

Buraya dikkat edin:

In [1]: x = [2,3,4]    
In [2]: y = x    
In [3]: x += 7,8,9    
In [4]: x
Out[4]: [2, 3, 4, 7, 8, 9]    
In [5]: y
Out[5]: [2, 3, 4, 7, 8, 9]    
In [6]: x += [44,55]    
In [7]: x
Out[7]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [8]: y
Out[8]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [9]: x = x + [33,22]    
In [10]: x
Out[10]: [2, 3, 4, 7, 8, 9, 44, 55, 33, 22]    
In [11]: y
Out[11]: [2, 3, 4, 7, 8, 9, 44, 55]

Referans için bakınız: + = neden listelerde beklenmedik şekilde davranıyor?


garip durum dışında yine de aynıx += 7,8,9
Ufos

Ayrıca, bağlantılı konulardan biri, tam olarak nerede farklı olduğu konusunda iyi bir tartışma sağlar. stackoverflow.com/questions/6951792/…
Ufos

31

+=bir değişkene bir sayı ekler, işlem sırasında değişkenin kendisini değiştirir (oysa +olmaz). Buna benzer şekilde, değişkeni de değiştiren aşağıdakiler vardır:

  • -=, değişkenden bir değer çıkarır, değişkeni sonuca ayarlar
  • *=, değişkeni ve bir değeri çarpar, sonucu değişken yapar
  • /=, değişkeni değere bölerek sonucu değişken yapar
  • %=, değişken daha sonra onun sonucuna ayarlanarak değişken üzerinde modül gerçekleştirir

Başkaları da olabilir. Ben bir Python programcısı değilim.


2
Sayılar için bu cevap doğrudur. (Bkz Bryan'ın cevabı özel davranış için.) Orada ciddi ciddi bit operatörleri (dahil olmak üzere birçok diğerleri &=, >>=vs.) ve ek matematik operatörleri ( **=vb.)
Michael


15

Bu sadece sözdizimsel bir kısayol değildir. Bunu dene:

x=[]                   # empty list
x += "something"       # iterates over the string and appends to list
print(x)               # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

karşı

x=[]                   # empty list
x = x + "something"    # TypeError: can only concatenate list (not "str") to list

Bu, + = 'nin iadd list yöntemini çağırdığını, ancak +' nın listelerle farklı şeyler yapan add işlevini çağırdığını gösterir .


7

Kavramsal olarak a + = b, sonucu a'da depolayan a'ya b "ekler". Bu basit açıklama, + = operatörünü birçok dilde açıklayacaktır.

Bununla birlikte, basit açıklama birkaç soruyu gündeme getiriyor.

  1. "Eklemek" ile tam olarak neyi kastediyoruz?
  2. "Sonucu a'da saklamak" ile tam olarak neyi kastediyoruz? python değişkenleri değerleri doğrudan depolamazlar, nesnelere başvuruları saklarlar.

Python'da, bu soruların her ikisinin de cevabı a'nın veri türüne bağlıdır.


Peki "ekleme" tam olarak ne anlama geliyor?

  • Sayılar için sayısal toplama anlamına gelir.
  • Listeler, demetler, dizeler vb. İçin birleştirme anlamına gelir.

+ = Listelerinin + 'dan daha esnek olduğunu, bir listedeki + operatörünün başka bir liste gerektirdiğini, ancak + = operatörünün yinelenebilir her şeyi kabul edeceğini unutmayın.


Öyleyse "değeri a'da saklamak" ne anlama geliyor?

Nesne değiştirilebilirse, değişikliği yerinde yapması teşvik edilir (ancak gerekli değildir). Yani a, daha önce yaptığı aynı nesneye işaret ediyor, ancak bu nesne artık farklı içeriğe sahip.

Nesne değişmez ise, o zaman açıkça değişikliği yerinde gerçekleştiremez. Bazı değiştirilebilir nesneler, yerinde "ekleme" işleminin bir uygulamasına da sahip olmayabilir. Bu durumda, "a" değişkeni, bir toplama işleminin sonucunu içeren yeni bir nesneyi işaret edecek şekilde güncellenecektir.

Teknik olarak bu, __IADD__önce bakılarak gerçekleştirilir, uygulanmazsa __ADD__denenir ve son olarak __RADD__.


+ = 'Yi python'da, tam türünden emin olmadığımız ve özellikle türün değişken olup olmadığından emin olmadığımız değişkenler üzerinde kullanırken dikkatli olmak gerekir. Örneğin aşağıdaki kodu göz önünde bulundurun.

def dostuff(a):
    b = a
    a += (3,4)
    print(repr(a)+' '+repr(b))

dostuff((1,2))
dostuff([1,2])

Bir tuple ile dostuff'ı çağırdığımızda, tuple + = işleminin bir parçası olarak kopyalanır ve böylece b etkilenmez. Ancak onu bir listeyle çağırdığımızda liste yerinde değiştirilir, bu nedenle hem a hem de b etkilenir.

Python 3'te "bayt" ve "baytearray" türlerinde benzer davranış gözlemlenir.


Son olarak, nesne değiştirilmese bile yeniden atamanın gerçekleştiğini unutmayın. Sol tarafın basitçe bir değişken olması çok da önemli değildir, ancak örneğin değiştirilebilir koleksiyonlara atıfta bulunan değişmez bir koleksiyonunuz olduğunda kafa karıştırıcı davranışlara neden olabilir:

a = ([1,2],[3,4])
a[0] += [5]

Bu durumda [5], [0] tarafından atıfta bulunulan listeye başarıyla eklenecektir, ancak daha sonra kod bir [0] atamayı denediğinde ve başarısız olduğunda bir istisna ortaya çıkacaktır.


5

Kısa cevap += "+ = 'nin sağındaki her şeyi + =' nin solundaki değişkene ekleyin" şeklinde tercüme edilebilir.

Ör. Eğer a = 10öyleysea += 5 : a = a + 5

Yani, "a" şimdi 15'e eşit.


Bu cevabın daha önce tartışılmamış olan katkısı nedir? Yinelenen bir Cevap ...

jdv, sadece yardım etmeye çalışıyorum. Ben yeni bir katılımcıyım, cevabımın bir kopya olduğunu düşünüyorsanız çok üzgünüm.

Diğer cevapların çoğuna bakarsanız, bunun bir kopya olduğu açıktır. Katkıda bulunmak iyidir, ancak yeni bir şeye katkıda bulunmaya çabalamalısınız (örneğin, add vs iadd yanıtı gibi) veya daha net bir çözüm için bir deneme yapmak istersiniz. Ancak, anlayabildiğim kadarıyla, en çok oylanan cevaplar, temel bir cevap için alabileceğiniz kadar açık.

4

Not x += yaynı değildir x = x + yek bir operatör nedeniyle dahildir bazı durumlarda operatör önceliği sağ taraf daima örneğin ilk değerlendirilir gerçeği ile birlikte

>>> x = 2
>>> x += 2 and 1
>>> x
3

>>> x = 2
>>> x = x + 2 and 1
>>> x
1

İlk durumun şu şekilde genişletildiğine dikkat edin:

>>> x = 2
>>> x = x + (2 and 1)
>>> x
3

Bununla 'gerçek dünyada' diğer operatörlerle karşılaşma olasılığınız daha yüksektir, örn.

x *= 2 + 1== x = x * (2 + 1)! =x = x * 2 + 1


4

+= sadece yazmak için bir kısayol

number = 4
number = number + 1

Yani onun yerine yazarsın

numbers = 4
numbers += 1

Her iki yol da doğrudur ancak örnek iki, biraz daha az kod yazmanıza yardımcı olur


1
Davranış sayılarda aynıdır ancak genel olarak aynı değildir.
fiş yıkama

0

Diğerlerinin de söylediği gibi, + = operatörü bir kısayoldur. Bir örnek:

var = 1;
var = var + 1;
#var = 2

Şu şekilde de yazılabilir:

var = 1;
var += 1;
#var = 2

Yani ilk örneği yazmak yerine, sadece ikinci örneği yazabilirsiniz ki bu gayet iyi çalışacaktır.


0

Eski hesap makinenizde örneğin 2 ve 3'ü ne zaman topladığınızı ve toplama =3'ün eklendiğini her bastığınızda +=, benzer iş yaptığını hatırlayın . Misal:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8

0

Birden çok tam sayı ile + = kullanarak ortaya çıkmayan birçok yanıt görüyorum.

Bir örnek:

x -= 1 + 3

Bu şuna benzer olacaktır:

x = x - (1 + 3)

ve yok:

x = (x - 1) + 3

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.