Mengapa kedua operasi ( append()
resp. +
) Ini memberikan hasil yang berbeda?
>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>>
Dalam kasus terakhir sebenarnya ada rekursi tak terbatas. c[-1]
dan c
sama. Mengapa berbeda dengan +
operasinya?
python
list
append
nested-lists
ooboo
sumber
sumber
+=
: stackoverflow.com/questions/725782/…Jawaban:
Untuk menjelaskan "mengapa":
The
+
operasi menambahkan berbagai elemen untuk array asli. Thearray.append
operasi menyisipkan array (atau benda apapun) ke akhir array asli, yang hasil dalam referensi untuk diri di tempat itu (maka rekursi tak terbatas).Perbedaannya di sini adalah bahwa operasi + bertindak spesifik saat Anda menambahkan larik (kelebihan beban seperti yang lain, lihat bab ini tentang urutan) dengan menggabungkan elemen. Namun metode append secara harfiah melakukan apa yang Anda minta: tambahkan objek di sisi kanan yang Anda berikan (array atau objek lain), alih-alih mengambil elemennya.
Sebuah alternatif
Gunakan
extend()
jika Anda ingin menggunakan fungsi yang berfungsi mirip dengan operator + (seperti yang ditunjukkan orang lain di sini juga). Tidaklah bijaksana untuk melakukan yang sebaliknya: mencoba meniru menambahkan dengan operator + untuk daftar (lihat tautan saya sebelumnya tentang mengapa).Sejarah kecil
Untuk bersenang-senang, sedikit sejarah: kelahiran modul array dengan Python pada Februari 1993. mungkin akan mengejutkan Anda, tetapi array ditambahkan setelah urutan dan daftar muncul.
sumber
+
simetris: daftar yang digabungkan dengan daftar.Operator penggabungan
+
adalah operator infiks biner yang, ketika diterapkan ke daftar, mengembalikan daftar baru yang berisi semua elemen dari masing-masing dua operannya. Thelist.append()
Metode adalahmutator
padalist
yang menambahkan tunggalobject
argumen (dalam contoh spesifik Anda daftarc
) dengan subjeklist
. Dalam contoh Anda, ini menghasilkanc
penambahan referensi ke dirinya sendiri (karena itu rekursi tak terbatas).Alternatif untuk penggabungan '+'
The
list.extend()
Metode ini juga merupakan metode mutator yang merangkai nyasequence
argumen dengan subjeklist
. Secara khusus, ini menambahkan setiap elemensequence
dalam urutan iterasi.Sebuah samping
Menjadi operator,
+
mengembalikan hasil ekspresi sebagai nilai baru. Menjadi metode non-chainingmutator
,list.extend()
mengubah daftar subjek di tempat dan tidak mengembalikan apa pun.Array
Saya telah menambahkan ini karena potensi kebingungan yang mungkin disebabkan oleh jawaban Abel di atas dengan mencampur diskusi tentang daftar, urutan, dan array.
Arrays
ditambahkan ke Python setelah urutan dan daftar, sebagai cara yang lebih efisien untuk menyimpan array tipe data integral. Jangan bingungarrays
denganlists
. Mereka tidaklah sama.Dari dokumen array :
Array adalah tipe urutan dan berperilaku sangat mirip dengan daftar, kecuali tipe objek yang disimpan di dalamnya dibatasi. Tipe ditentukan pada waktu pembuatan objek dengan menggunakan kode tipe, yang merupakan karakter tunggal.
sumber
append
sedang menambahkan elemen ke daftar. jika Anda ingin memperluas daftar dengan daftar baru yang perlu Anda gunakanextend
.sumber
+
danextend
menghasilkan hasil yang berbeda yang harus kita pikirkan.append
dan+
berbeda. Karena itulah. Saya suka jawaban ini karena menawarkan apa yang harus dilakukan yang lebih masuk akal.__lt__
tidak bisa di-overload dengan Python (sekarang bisa). Mengapa-pertanyaan adalah yang paling penting tetapi seringkali yang paling sulit untuk dijawab: mereka menanyakan esensi, bukan petunjuk ke manual. Dan tentu saja: jika Anda tidak menyukai sebuah pertanyaan (saya paling tidak suka), maka jangan menjawab ;-)c += [c]
danc.append(c[:])
juga.a+b != a*b
? Mereka operasi yang berbeda. Itulah jawabannya. "Mengapa" tidak membantu seperti pertanyaan lain, seperti "Bagaimana cara menambahkan dengan benar?" Atau "Apa yang salah dengan lampiran ini yang mengarah pada rekursi tak terbatas?" Pertanyaan dalam bentuk "Apa yang harus saya lakukan pada X" atau "Apa yang salah saat saya melakukan X"? Atau "Apa yang harus saya lakukan selain X" juga akan membantu seseorang belajar, tetapi akan memberikan jawaban yang terfokus, dapat digunakan, dan dapat ditindaklanjuti.Daftar Python bersifat heterogen yaitu elemen dalam daftar yang sama dapat berupa semua jenis objek. Ekspresi:
c.append(c)
menambahkan objekc
apa pun itu ke daftar. Dalam kasus itu membuat daftar itu sendiri menjadi anggota daftar.Ekspresi
c += c
menambahkan dua daftar bersama-sama dan memberikan hasilnya ke variabelc
.+
Operator yang kelebihan beban ditentukan pada daftar untuk membuat daftar baru yang isinya adalah elemen dalam daftar pertama dan elemen dalam daftar kedua.Jadi ini sebenarnya hanyalah ekspresi berbeda yang digunakan untuk melakukan berbagai hal sesuai desain.
sumber
Metode yang Anda cari adalah
extend()
. Dari dokumentasi Python :sumber
Anda harus menggunakan extender ()
info lain: menambahkan vs. memperpanjang
sumber
Lihat dokumentasinya :
c.append(c)
"menambahkan" c ke dirinya sendiri sebagai elemen . Karena daftar adalah tipe referensi, ini membuat struktur data rekursif.c += c
setara denganextend(c)
, yang menambahkan elemen c ke c.sumber