Saya perlu tahu apa yang + = lakukan dengan python. Sesederhana itu. Saya juga akan menghargai tautan ke definisi alat tangan pendek lainnya di python.
Saya perlu tahu apa yang + = lakukan dengan python. Sesederhana itu. Saya juga akan menghargai tautan ke definisi alat tangan pendek lainnya di python.
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.
>>> 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.
__iadd__
yang mengembalikan tipe yang berbeda (yang dengan sendirinya dapat ditambahkan)
+=
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.
x += 5
tidak persis sama dengan mengatakan x = x + 5
di 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?
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.
&=
, >>=
, 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 .
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.
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.
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].
Jawaban singkatnya +=
dapat diterjemahkan sebagai "tambahkan apa pun yang ada di kanan + = ke variabel di sebelah kiri + =".
Ex. Jika sudah a = 10
maka a += 5
akan menjadi: a = a + 5
Jadi, "a" sekarang sama dengan 15.
Catatan x += y
tidak sama seperti x = x + y
dalam 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
+=
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
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.
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
Menurut dokumentasi
x += y
setara denganx = operator.iadd(x, y)
. Cara lain untuk mengatakannya adalah dengan mengatakan ituz = operator.iadd(x, y)
setara dengan pernyataan majemukz = x; z += y
.
Begitu x += 3
pula dengan x = x + 3
.
x = 2
x += 3
print(x)
akan menghasilkan 5.
Perhatikan bahwa ada juga
object.__iadd__