Apa sebenarnya yang + = lakukan dengan python?


118

Saya perlu tahu apa yang + = lakukan dengan python. Sesederhana itu. Saya juga akan menghargai tautan ke definisi alat tangan pendek lainnya di python.



2
Ini adalah operator dasar untuk python (dan banyak bahasa lainnya juga), Anda harus mulai dengan google, jika Anda tidak pernah membaca referensi python.
technomage

3
@AndiDog Meskipun benar, kedua pertanyaan tersebut adalah tentang operator (+ =), yang Anda tautkan adalah tentang penggunaan yang canggih dan masalah yang halus, dan OP di sini mungkin belum dapat mengikuti alasannya di sana.
Dr. belisarius

3
@AndiDog Mungkin Anda benar pada saat itu, tetapi melihat solusi yang (hampir) diterima di sini, jelas bahwa pertanyaan ini adalah tentang pemahaman dasar operator: D
Dr. belisarius

1
Sebagian besar penggunaan sumbol sekarang diindeks di halaman Simbol docs.python.org/3/genindex-Symbols.html .
Terry Jan Reedy

Jawaban:


148

Dalam Python, + = adalah lapisan gula untuk __iadd__metode khusus, __add__atau __radd__jika __iadd__tidak ada. The __iadd__metode kelas bisa melakukan apa saja yang diinginkannya. Objek daftar mengimplementasikannya dan menggunakannya untuk melakukan iterasi pada objek yang dapat diulang yang menambahkan setiap elemen ke dirinya sendiri dengan cara yang sama seperti yang dilakukan metode perluasan daftar.

Berikut adalah kelas khusus sederhana yang mengimplementasikan __iadd__metode khusus. Anda menginisialisasi objek dengan int, kemudian dapat menggunakan operator + = untuk menambahkan angka. Saya telah menambahkan pernyataan cetak __iadd__untuk menunjukkan bahwa itu dipanggil. Juga, __iadd__diharapkan mengembalikan objek, jadi saya mengembalikan penambahan itu sendiri ditambah angka lain yang masuk akal dalam kasus ini.

>>> 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

Semoga ini membantu.


24
Meskipun ini bukan yang dicari Penanya, +1 untuk jawaban sebenarnya. =)
Michael

@ Michael, di situlah humor menambah fakta ... :-D
Aaron John Sabu

3
+1 untuk menjawab pertanyaan, tetapi -1 untuk __iadd__yang mengembalikan tipe yang berbeda (yang dengan sendirinya dapat ditambahkan)
Caleth

Jawaban ini terlalu rumit untuk tipe orang yang perlu bertanya apa + = artinya (yaitu, seorang pemula). Jawaban Anda bukanlah jawaban pemula, bukan hanya karena para pemula biasanya tidak mulai belajar Python dengan cara berorientasi objek, tetapi juga karena ada jawaban yang jauh lebih sederhana (seperti @ Imran di bawah). Hanya dua sen saya, meskipun saya menghargai jawaban ini.
q-compute

129

+= menambahkan nilai lain dengan nilai variabel dan memberikan nilai baru ke variabel.

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

-=, *=, /=Tidak sama untuk pengurangan, perkalian dan pembagian.


19
"sendiri" sebenarnya adalah deskripsi yang sangat buruk di sini, karena bilangan bulat tidak dapat diubah.
AndiDog

41

x += 5tidak persis sama dengan mengatakan x = x + 5di Python.

Catatan di sini:

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]

Lihat untuk referensi: Mengapa + = berperilaku tidak terduga di daftar?


itu sama, meskipun, kecuali untuk kasus anehx += 7,8,9
Ufos

Selain itu, salah satu utas yang ditautkan memberikan diskusi yang baik tentang perbedaan sebenarnya. stackoverflow.com/questions/6951792/…
Ufos

31

+=menambahkan angka ke variabel, mengubah variabel itu sendiri dalam proses (sedangkan +tidak mau). Mirip dengan ini, ada yang berikut yang juga memodifikasi variabel:

  • -=, mengurangi nilai dari variabel, menyetel variabel ke hasil
  • *=, mengalikan variabel dan nilai, membuat hasil menjadi variabel
  • /=, membagi variabel dengan nilai, menjadikan hasil sebagai variabel
  • %=, melakukan modulus pada variabel tersebut, dengan variabel tersebut kemudian disetel ke hasilnya

Mungkin ada orang lain. Saya bukan programmer Python.


2
Untuk angka, jawaban ini benar. (Lihat jawaban Bryan untuk perilaku khusus.) Ada memang beberapa orang lain, termasuk operator bitwise ( &=, >>=, dll) dan operator matematika tambahan ( **=, dll).
Michael


15

Ini bukan jalan pintas sintaksis belaka. Coba ini:

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

melawan

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

Ini menggambarkan bahwa + = memanggil metode daftar iadd tetapi + memanggil add , yang melakukan hal-hal berbeda dengan daftar.


7

Secara khusus a + = b "menambahkan" b ke a menyimpan hasil di a. Deskripsi sederhana ini akan menjelaskan operator + = dalam banyak bahasa.

Namun deskripsi sederhana tersebut menimbulkan beberapa pertanyaan.

  1. Apa sebenarnya yang kami maksud dengan "menambahkan"?
  2. Apa sebenarnya yang kami maksud dengan "menyimpan hasil di"? variabel python tidak menyimpan nilai secara langsung, mereka menyimpan referensi ke objek.

Dalam python jawaban untuk kedua pertanyaan ini bergantung pada tipe data a.


Jadi, apa sebenarnya arti "menambahkan"?

  • Untuk angka itu berarti penambahan numerik.
  • Untuk daftar, tupel, string, dll. Artinya penggabungan.

Perhatikan bahwa untuk daftar + = lebih fleksibel daripada +, operator + pada daftar memerlukan daftar lain, tetapi operator + = akan menerima iterable.


Jadi, apa artinya "menyimpan nilai dalam"?

Jika objek bisa berubah maka itu didorong (tapi tidak diharuskan) untuk melakukan modifikasi di tempat. Jadi poin ke objek yang sama seperti sebelumnya tetapi objek itu sekarang memiliki konten yang berbeda.

Jika objek tidak dapat diubah maka jelas tidak dapat melakukan modifikasi di tempat. Beberapa objek yang bisa berubah mungkin juga tidak memiliki implementasi operasi "tambah" di tempat. Dalam hal ini variabel "a" akan diperbarui untuk menunjuk ke objek baru yang berisi hasil operasi penjumlahan.

Secara teknis ini dilaksanakan dengan mencari __IADD__terlebih dahulu, jika tidak dilaksanakan maka __ADD__dicoba dan terakhir __RADD__.


Kehati-hatian diperlukan saat menggunakan + = dalam python pada variabel di mana kita tidak yakin dengan jenis pastinya dan khususnya di mana kita tidak yakin apakah jenisnya bisa berubah atau tidak. Misalnya perhatikan kode berikut.

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

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

Ketika kita memanggil dostuff dengan sebuah tupel maka tupel tersebut disalin sebagai bagian dari operasi + = dan b tidak terpengaruh. Namun ketika kita memanggilnya dengan daftar, daftar tersebut diubah pada tempatnya, jadi baik a dan b terpengaruh.

Dalam python 3, perilaku serupa diamati dengan jenis "byte" dan "bytearray".


Akhirnya perhatikan bahwa penugasan kembali terjadi bahkan jika objek tidak diganti. Ini tidak terlalu menjadi masalah jika sisi kiri hanyalah sebuah variabel tetapi dapat menyebabkan perilaku yang membingungkan ketika Anda memiliki koleksi yang tidak dapat diubah yang mengacu pada koleksi yang dapat berubah misalnya:

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

Dalam kasus ini [5] akan berhasil ditambahkan ke daftar yang dirujuk oleh [0] tetapi kemudian pengecualian akan dimunculkan ketika kode mencoba dan gagal untuk menetapkan kembali [0].


5

Jawaban singkatnya +=dapat diterjemahkan sebagai "tambahkan apa pun yang ada di kanan + = ke variabel di sebelah kiri + =".

Ex. Jika sudah a = 10maka a += 5akan menjadi: a = a + 5

Jadi, "a" sekarang sama dengan 15.


Apa kontribusi jawaban ini yang belum didiskusikan? Ini duplikat Jawaban ...

jdv, hanya mencoba membantu. Saya seorang kontributor baru, mohon maaf jika menurut Anda jawaban saya adalah duplikat.

Jelas bahwa ini adalah duplikat jika Anda melihat sebagian besar jawaban lainnya. Tidak masalah untuk berkontribusi, tetapi Anda harus berusaha untuk memberikan kontribusi yang baru (misalnya, seperti jawaban tambah vs iadd) atau Anda ingin mencoba solusi yang lebih jelas. Tapi, sejauh yang saya tahu, jawaban pilihan teratas sejelas mungkin untuk jawaban dasar.

4

Catatan x += ytidak sama seperti x = x + ydalam beberapa situasi di mana operator tambahan dimasukkan karena prioritas operator digabungkan dengan fakta bahwa sisi kanan selalu dievaluasi terlebih dahulu, mis.

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

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

Perhatikan kasus pertama berkembang menjadi:

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

Anda lebih mungkin menemukan ini di 'dunia nyata' dengan operator lain, mis

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


4

+= hanyalah jalan pintas untuk menulis

number = 4
number = number + 1

Jadi sebagai gantinya Anda akan menulis

numbers = 4
numbers += 1

Kedua cara itu benar tetapi contoh dua membantu Anda menulis lebih sedikit kode


1
Perilakunya sama pada angka tetapi tidak sama secara umum.
plugwash

0

Seperti yang juga dikatakan orang lain, + = operator adalah jalan pintas. Sebuah contoh:

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

Bisa juga ditulis seperti ini:

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

Jadi, alih-alih menulis contoh pertama, Anda bisa menulis contoh kedua, yang akan bekerja dengan baik.


0

Ingatlah ketika Anda biasa menjumlahkan, misalnya 2 & 3, di kalkulator lama Anda dan setiap kali Anda menekan angka =3 yang ditambahkan ke total, pekerjaan +=itu serupa. Contoh:

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

0

Saya melihat banyak jawaban yang tidak muncul menggunakan + = dengan beberapa bilangan bulat.

Satu contoh:

x -= 1 + 3

Ini akan mirip dengan:

x = x - (1 + 3)

dan tidak:

x = (x - 1) + 3

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.