Operator penugasan "augmented" seperti +=
diperkenalkan dalam Python 2.0, yang dirilis pada Oktober 2000. Desain dan alasannya dijelaskan dalam PEP 203 . Salah satu tujuan yang dinyatakan dari operator ini adalah dukungan operasi di tempat. Penulisan
a = [1, 2, 3]
a += [4, 5, 6]
seharusnya memperbarui daftar a
di tempat . Ini penting jika ada referensi lain ke daftar a
, misalnya ketika a
diterima sebagai argumen fungsi.
Namun, operasi tidak selalu dapat terjadi di tempat, karena banyak tipe Python, termasuk bilangan bulat dan string, tidak dapat diubah , jadi misalnya i += 1
untuk bilangan bulat i
tidak mungkin beroperasi di tempat.
Singkatnya, operator penugasan augmented seharusnya bekerja di tempat bila memungkinkan, dan membuat objek baru sebaliknya. Untuk memfasilitasi sasaran desain ini, ekspresi x += y
ditentukan untuk berperilaku sebagai berikut:
- Jika
x.__iadd__
didefinisikan, x.__iadd__(y)
dievaluasi.
- Kalau tidak, jika
x.__add__
diterapkan x.__add__(y)
dievaluasi.
- Kalau tidak, jika
y.__radd__
diterapkan y.__radd__(x)
dievaluasi.
- Kalau tidak, salahkan.
Hasil pertama yang diperoleh oleh proses ini akan ditugaskan kembali x
(kecuali jika hasil itu adalah NotImplemented
singleton, dalam hal ini pencarian dilanjutkan dengan langkah berikutnya).
Proses ini memungkinkan jenis yang mendukung modifikasi di tempat untuk menerapkan __iadd__()
. Jenis yang tidak mendukung modifikasi di tempat tidak perlu menambahkan metode sihir baru, karena Python akan secara otomatis kembali ke dasarnya x = x + y
.
Jadi mari kita akhirnya datang ke pertanyaan Anda yang sebenarnya - mengapa Anda dapat menambahkan tuple ke daftar dengan operator penugasan augmented Dari memori, sejarah ini kira-kira seperti ini: list.__iadd__()
Metode ini diterapkan untuk memanggil metode yang sudah ada list.extend()
di Python 2.0. Ketika iterator diperkenalkan dengan Python 2.1, list.extend()
metode ini diperbarui untuk menerima iterator yang sewenang-wenang. Hasil akhir dari perubahan ini adalah yang my_list += my_tuple
bekerja mulai dari Python 2.1. The list.__add__()
metode, bagaimanapun, tidak pernah seharusnya mendukung iterator sewenang-wenang sebagai argumen kanan - ini dianggap tidak pantas untuk bahasa sangat diketik.
Saya pribadi berpikir implementasi dari operator augmented menjadi agak terlalu rumit dalam Python. Ini memiliki banyak efek samping yang mengejutkan, misalnya kode ini:
t = ([42], [43])
t[0] += [44]
Baris kedua memunculkan TypeError: 'tuple' object does not support item assignment
, tetapi operasi tetap berhasil dilakukan - t
akan ([42, 44], [43])
setelah mengeksekusi baris yang memunculkan kesalahan.