Saya perlu tahu apa yang + = lakukan dengan python. Sesederhana itu. Saya juga akan menghargai tautan ke definisi alat tangan pendek lainnya di python.
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
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.
>>>classAdder(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 +=3in __iadd__ 3>>> a
5
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.
"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,9In[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]
+=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.
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
16
Ini menambahkan operan kanan ke kiri. x += 2carax = x + 2
Itu juga dapat menambahkan elemen ke daftar - lihat utas SO ini .
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.
Apa sebenarnya yang kami maksud dengan "menambahkan"?
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].
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 +=2and1>>> x
3>>> x =2>>> x = x +2and1>>> x
1
Perhatikan kasus pertama berkembang menjadi:
>>> x =2>>> x = x +(2and1)>>> x
3
Anda lebih mungkin menemukan ini di 'dunia nyata' dengan operator lain, mis
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:
x += ysetara dengan x = operator.iadd(x, y). Cara lain untuk mengatakannya adalah dengan mengatakan itu z = operator.iadd(x, y)setara dengan pernyataan majemuk z = x; z += y.
object.__iadd__
Jawaban:
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.Semoga ini membantu.
sumber
__iadd__
yang mengembalikan tipe yang berbeda (yang dengan sendirinya dapat ditambahkan)+=
menambahkan nilai lain dengan nilai variabel dan memberikan nilai baru ke variabel.-=
,*=
,/=
Tidak sama untuk pengurangan, perkalian dan pembagian.sumber
x += 5
tidak persis sama dengan mengatakanx = x + 5
di Python.Catatan di sini:
Lihat untuk referensi: Mengapa + = berperilaku tidak terduga di daftar?
sumber
x += 7,8,9
+=
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 hasilnyaMungkin ada orang lain. Saya bukan programmer Python.
sumber
&=
,>>=
, dll) dan operator matematika tambahan (**=
, dll).Ini menambahkan operan kanan ke kiri.
x += 2
carax = x + 2
Itu juga dapat menambahkan elemen ke daftar - lihat utas SO ini .
sumber
Ini bukan jalan pintas sintaksis belaka. Coba ini:
melawan
Ini menggambarkan bahwa + = memanggil metode daftar iadd tetapi + memanggil add , yang melakukan hal-hal berbeda dengan daftar.
sumber
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.
Dalam python jawaban untuk kedua pertanyaan ini bergantung pada tipe data a.
Jadi, apa sebenarnya arti "menambahkan"?
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.
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:
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].
sumber
Jawaban singkatnya
+=
dapat diterjemahkan sebagai "tambahkan apa pun yang ada di kanan + = ke variabel di sebelah kiri + =".Ex. Jika sudah
a = 10
makaa += 5
akan menjadi:a = a + 5
Jadi, "a" sekarang sama dengan 15.
sumber
Catatan
x += y
tidak sama sepertix = x + y
dalam beberapa situasi di mana operator tambahan dimasukkan karena prioritas operator digabungkan dengan fakta bahwa sisi kanan selalu dievaluasi terlebih dahulu, mis.Perhatikan kasus pertama berkembang menjadi:
Anda lebih mungkin menemukan ini di 'dunia nyata' dengan operator lain, mis
x *= 2 + 1
==x = x * (2 + 1)
! =x = x * 2 + 1
sumber
+=
hanyalah jalan pintas untuk menulisJadi sebagai gantinya Anda akan menulis
Kedua cara itu benar tetapi contoh dua membantu Anda menulis lebih sedikit kode
sumber
Seperti yang juga dikatakan orang lain, + = operator adalah jalan pintas. Sebuah contoh:
Bisa juga ditulis seperti ini:
Jadi, alih-alih menulis contoh pertama, Anda bisa menulis contoh kedua, yang akan bekerja dengan baik.
sumber
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:sumber
Saya melihat banyak jawaban yang tidak muncul menggunakan + = dengan beberapa bilangan bulat.
Satu contoh:
Ini akan mirip dengan:
dan tidak:
sumber
Menurut dokumentasi
Begitu
x += 3
pula denganx = x + 3
.akan menghasilkan 5.
Perhatikan bahwa ada juga
sumber