Apa perbedaan antara:
some_list1 = []
some_list1.append("something")
dan
some_list2 = []
some_list2 += ["something"]
python
list
concatenation
Nggak
sumber
sumber
extend
.+=
vsextend
: stackoverflow.com/questions/3653298/…+=
vsappend
stackoverflow.com/q/252703/6674599Jawaban:
Untuk kasus Anda, satu-satunya perbedaan adalah kinerja: menambahkan dua kali lebih cepat.
Secara umum
append
akan menambahkan satu item ke daftar, sementara+=
akan menyalin semua elemen daftar sisi kanan ke daftar sisi kiri.Pembaruan: analisis kinerja
Membandingkan bytecode, kita dapat mengasumsikan bahwa
append
versi membuang siklus dalamLOAD_ATTR
+CALL_FUNCTION
, dan + = versi - inBUILD_LIST
. TernyataBUILD_LIST
melebihiLOAD_ATTR
+CALL_FUNCTION
.Kami dapat lebih meningkatkan kinerja dengan menghilangkan
LOAD_ATTR
overhead:sumber
append
vs+=
, maka Anda harus menyertakan pembuatan daftar sebagai bagian dari pengukuran. Jika tidak, itu akan menjadi pertanyaan yang berbeda (extend
vs+=
).Dalam contoh yang Anda berikan, tidak ada perbedaan, dalam hal keluaran, antara
append
dan+=
. Tetapi ada perbedaan antaraappend
dan+
(pertanyaan mana yang awalnya ditanyakan).Seperti yang Anda lihat,
append
dan+=
memiliki hasil yang sama; mereka menambahkan item ke daftar, tanpa membuat daftar baru. Menggunakan+
menambahkan dua daftar dan menghasilkan daftar baru.sumber
append
menambahkan satu entri ke daftar, sementara + = menambahkan sebanyak yang ada di daftar lainnya (yaitu aliasextend
). Tapi dia sudah tahu itu, dilihat dari cara pertanyaan itu ditulis. Apakah ada perbedaan lain yang saya lewatkan?Lihat bahwa menambahkan menambahkan satu elemen ke daftar, yang bisa berupa apa saja.
+=[]
bergabung dengan daftar.sumber
+ = adalah tugas. Ketika Anda menggunakannya, Anda benar-benar mengatakan 'some_list2 = some_list2 + [' sesuatu ']'. Tugas melibatkan pengikatan ulang, jadi:
Operator + = biasanya juga membuat objek list baru seperti list + list biasanya:
Namun kenyataannya:
Ini karena daftar Python mengimplementasikan __iadd __ () untuk membuat sirkuit pendek tugas tambahan + = dan memanggil list.extend () sebagai gantinya. (Ini agak aneh kutil ini: biasanya melakukan apa yang Anda maksud, tetapi untuk alasan yang membingungkan.)
Secara umum, jika Anda menambahkan / memperluas daftar yang sudah ada, dan Anda ingin menyimpan referensi ke daftar yang sama (daripada membuat yang baru), sebaiknya eksplisit dan tetap dengan append () / memperpanjang () metode.
sumber
sebenarnya
untuk satu nilai, tidak ada perbedaan. Dokumentasi menyatakan, bahwa:
Jadi jelas
s.append(x)
sama dengans.extend([x])
sumber
Perbedaannya adalah bahwa concatenate akan meratakan daftar yang dihasilkan, sedangkan append akan menjaga level tetap utuh:
Jadi misalnya dengan:
Menggunakan append, Anda akan mendapatkan daftar daftar:
Menggunakan penggabungan sebagai gantinya, Anda berakhir dengan daftar datar:
sumber
Tes kinerja di sini tidak benar:
misalnya
tes yang baik dapat ditemukan di sini: http://markandclick.com/1/post/2012/01/python-list-append-vs.html
sumber
+= [one_var]
. Jika kita menghilangkan pembuatan daftar, + = menjadi pilihan tercepat.Selain aspek yang dijelaskan dalam jawaban lain, append dan + [] memiliki perilaku yang sangat berbeda saat Anda mencoba membuat daftar.
list1 + ['5', '6'] menambahkan '5' dan '6' ke list1 sebagai elemen individual. list1.append (['5', '6']) menambahkan daftar ['5', '6'] ke list1 sebagai satu elemen.
sumber
Perilaku rebinding yang disebutkan dalam jawaban lain memang penting dalam keadaan tertentu:
Itu karena penugasan yang bertambah selalu mem-rebind, bahkan jika objek dimutasi di tempat. Rebinding di sini kebetulan
a[1] = *mutated list*
, yang tidak bekerja untuk tupel.sumber
mari kita ambil contoh dulu
sumber
Metode append () menambahkan satu item ke daftar yang ada
Jadi di sini some_list1 akan dimodifikasi.
Diperbarui:
Sedangkan menggunakan + untuk menggabungkan elemen list (lebih dari satu elemen) pada list yang ada mirip dengan extender (seperti yang dikoreksi oleh Flux ).
Jadi di sini some_list2 dan ["sesuatu"] adalah dua daftar yang digabungkan.
sumber
+=
tidak mengembalikan daftar baru. The Programming FAQ mengatakan: "... untuk daftar,__iadd__
setara dengan memanggilextend
pada daftar dan kembali daftar itu sebabnya kami mengatakan bahwa untuk daftar,.+=
Adalah 'singkatan' untuklist.extend
". Anda juga dapat melihatnya sendiri di kode sumber CPython: github.com/python/cpython/blob/v3.8.2/Objects/…"+" tidak mengubah daftar
.append () mengubah daftar lama
sumber