Python append () vs. + operator pada daftar, mengapa ini memberikan hasil yang berbeda?

113

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 csama. Mengapa berbeda dengan +operasinya?

ooboo
sumber
1
dengan segala hormat untuk pertanyaan baru yang layak: Saya menggulung kembali ke pertanyaan awal agar tetap bersih (1 pertanyaan per utas, lihat SO FAQ). Silakan ajukan pertanyaan baru atau ajukan pertanyaan tindak lanjut di dalam utas komentar di bawah setiap jawaban. Catatan: hasil edit Anda tidak hilang, klik riwayat dan Anda dapat menyalin / menempelkannya ke pertanyaan baru.
Abel
Mirip untuk +=: stackoverflow.com/questions/725782/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Tampaknya memberikan jawaban yang berbeda, tetapi tidak seperti itu. Jika Anda ingin menambahkan nilai menggunakan + operator Anda harus menggunakan tanda []. c + = [c] akan memberi Anda hasil yang sama seperti menambahkan.
Sharif Chowdhury
@SharifChowhury Saya yakin Anda akan mendapatkan hasil yang sama
trustory

Jawaban:

142

Untuk menjelaskan "mengapa":

The +operasi menambahkan berbagai elemen untuk array asli. The array.appendoperasi 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.

Abel
sumber
2
1 karena saya selalu memberikan suara positif pada informasi yang akurat. Tautan ke dokumen resmi selalu menjadi nilai tambah!
jatanisme
10
Bagian lain dari "mengapa": orang yang waras berharap +simetris: daftar yang digabungkan dengan daftar.
Beni Cherniavsky-Paskin
1
+1, Poin yang bagus Beni (sementara saya bisa menganggapnya sebagai "waras" untuk mengatakan "objek di sisi rh ditambahkan ke array di sisi lh", tetapi secara pribadi merasa perilaku saat ini lebih masuk akal).
Abel
jika sebuah elemen adalah string tunggal, misalnya s = 'word', l = ['this', 'is']. Kemudian l.append (s) dan l + s harus sama. Apakah saya benar?
pengguna3512680
23

Operator penggabungan +adalah operator infiks biner yang, ketika diterapkan ke daftar, mengembalikan daftar baru yang berisi semua elemen dari masing-masing dua operannya. The list.append()Metode adalah mutatorpada listyang menambahkan tunggal objectargumen (dalam contoh spesifik Anda daftar c) dengan subjek list. Dalam contoh Anda, ini menghasilkan cpenambahan referensi ke dirinya sendiri (karena itu rekursi tak terbatas).

Alternatif untuk penggabungan '+'

The list.extend()Metode ini juga merupakan metode mutator yang merangkai nya sequenceargumen dengan subjek list. Secara khusus, ini menambahkan setiap elemen sequencedalam urutan iterasi.

Sebuah samping

Menjadi operator, +mengembalikan hasil ekspresi sebagai nilai baru. Menjadi metode non-chaining mutator, 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. Arraysditambahkan ke Python setelah urutan dan daftar, sebagai cara yang lebih efisien untuk menyimpan array tipe data integral. Jangan bingung arraysdengan lists. 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.

Dave
sumber
18

appendsedang menambahkan elemen ke daftar. jika Anda ingin memperluas daftar dengan daftar baru yang perlu Anda gunakan extend.

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
SilentGhost
sumber
4
Saya pikir cukup jelas mengapa hasilnya berbeda, karena operasinya tidak sama! jika itu akan muncul +dan extendmenghasilkan hasil yang berbeda yang harus kita pikirkan.
SilentGhost
1
+1: Mengapa saya tidak menyukai pertanyaan "mengapa": appenddan +berbeda. Karena itulah. Saya suka jawaban ini karena menawarkan apa yang harus dilakukan yang lebih masuk akal.
S. Lotot
Bukankah situs ini tentang menjawab pertanyaan yang diajukan? Orang-orang bertanya mengapa PHP disebut PHP dan mengapa __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 ;-)
Abel
Untuk demonstrasi lebih lanjut, mungkin pertunjukan c += [c]dan c.append(c[:])juga.
ephemient
2
@Abel: Mengapa 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.
S. Lotot
8

Daftar Python bersifat heterogen yaitu elemen dalam daftar yang sama dapat berupa semua jenis objek. Ekspresi: c.append(c)menambahkan objek capa pun itu ke daftar. Dalam kasus itu membuat daftar itu sendiri menjadi anggota daftar.

Ekspresi c += cmenambahkan dua daftar bersama-sama dan memberikan hasilnya ke variabel c. +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.

Tendayi Mawushe
sumber
7

Metode yang Anda cari adalah extend(). Dari dokumentasi Python :

list.append(x)
    Add an item to the end of the list; equivalent to a[len(a):] = [x].

list.extend(L)
    Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.

list.insert(i, x)
    Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).
Chinmay Kanchi
sumber
3

Anda harus menggunakan extender ()

>>> c=[1,2,3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]

info lain: menambahkan vs. memperpanjang

anjing hantu74
sumber
2

Lihat dokumentasinya :

list.append (x)

  • Tambahkan item ke akhir daftar; setara dengan [len (a):] = [x].

list.extend (L) - Memperluas daftar dengan menambahkan semua item dalam daftar yang diberikan; setara dengan [len (a):] = L.

c.append(c)"menambahkan" c ke dirinya sendiri sebagai elemen . Karena daftar adalah tipe referensi, ini membuat struktur data rekursif.

c += csetara dengan extend(c), yang menambahkan elemen c ke c.

oefe
sumber