Python listelerde () ve + operatörü ekler, bunlar neden farklı sonuçlar verir?


113

Neden bu iki işlem ( append()sırasıyla +) farklı sonuçlar veriyor?

>>> 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, [...]]
>>> 

Son durumda aslında sonsuz bir özyineleme vardır. c[-1]ve caynıdır. +Operasyonla neden farklı ?


1
geçerli yeni bir soruya tüm saygımla: Temiz tutmak için orijinal soruya geri döndüm (konu başına 1 soru, bkz. SO SSS). Lütfen yeni bir tane sorun veya her cevabın altındaki yorum dizilerinin içinde takip soruları sorun. Not: Düzenlemeleriniz kaybolmaz, geçmişe tıklayın ve kopyalayıp yeni bir soruya yapıştırabilirsiniz.
Abel


farklı anlar veriyor gibi görünüyor, ama böyle değil. + İşlecini kullanarak bir değer eklemek istiyorsanız, [] işaretini kullanmalısınız. c + = [c] size append ile aynı sonucu verecektir.
Sharif Chowdhury

@SharifChowdhury Aynı sonucu alacağına inanıyorum
trustory

Yanıtlar:


142

"Neden" i açıklamak için:

+İşlem ekler dizi özgün dizi elemanları. array.appendİşlemin özgün dizinin sonuna, içinde dizi (ya da herhangi bir nesneyi) ekler ki bir sonuçlanır kendine referansla bu noktada (dolayısıyla, sonsuz bir yineleme) 'de.

Buradaki fark , öğeyi birleştirerek bir dizi eklediğinizde (diğerleri gibi aşırı yüklenmiş , dizilerle ilgili bu bölüme bakın ) + işleminin belirli davranmasıdır . Ancak append yöntemi tam anlamıyla istediğiniz şeyi yapar: nesneyi, öğelerini almak yerine verdiğiniz sağ tarafa (dizi veya başka bir nesne) ekleyin.

Bir alternatif

Kullanın extend()Eğer (diğerleri de burada gösterdiği gibi) + operatörüne benzer davranan bir fonksiyonu kullanmak istiyorum. Bunun tersini yapmak akıllıca değildir: Listeler için + operatörüyle eki taklit etmeye çalışmak ( neden ile ilgili önceki bağlantıma bakın ).

Küçük tarih

Eğlenmek için, biraz tarih: Şubat 1993'te dizi modülünün Python'da doğuşu sizi şaşırtabilir, ancak diziler, diziler ve listeler ortaya çıktıktan sonra eklenmiştir.


2
+1 çünkü her zaman doğru bilgileri yükseltirim. Resmi belgelere bağlantılar her zaman bir artıdır!
jathanizm

10
"Neden" in bir başka parçası: aklı başında insanlar +simetrik olmayı bekler : listeyi listeyle birleştirin.
Beni Cherniavsky-Paskin

1
+1, İyi nokta Beni (ben "sağ taraftaki nesne lh tarafındaki diziye eklenmiştir" demenin "mantıklı" olduğunu düşünebilirim, ancak kişisel olarak mevcut davranışı daha mantıklı buluyorum).
Abel

bir eleman tek bir dizeyse, örneğin s = 'kelime', l = ['bu', 'eşittir']. Sonra l.append (s) ve l + s aynı olmalıdır. Doğrumuyum?
user3512680

23

Birleştirme operatörü +, listelere uygulandığında, iki işleneninden her birinin tüm öğelerini içeren yeni bir liste döndüren ikili bir infix operatörüdür. list.append()Yöntem olduğu mutatorüzerinde listonun tek ekler object(özel örnekte liste halinde argüman cdeneğe) list. cÖrneğinizde bu, kendisine bir referans eklemeyle sonuçlanır (dolayısıyla sonsuz özyineleme).

'+' Birleştirmeye bir alternatif

list.extend()Yöntem ayrıca birleştirir bir mutatör yöntemdir sequencekonu ile argüman list. Özellikle, öğelerinin her birini sequenceyineleme sırasına göre ekler .

Bir kenara

Operatör olmak +, ifadenin sonucunu yeni bir değer olarak döndürür. Zincirleme olmayan bir mutatoryöntem olmak list.extend(), konu listesini yerinde değiştirir ve hiçbir şey döndürmez.

Diziler

Bunu, yukarıdaki Abel'in yanıtının listeler, diziler ve diziler tartışmasını karıştırarak neden olabileceği olası karışıklık nedeniyle ekledim. Arraysintegral veri türlerinin dizilerini depolamanın daha verimli bir yolu olarak, sıralar ve listelerden sonra Python'a eklenmiştir. Karıştırmayın arraysile lists. Aynı değiller.

Gönderen dizi docs :

Diziler, dizi türleridir ve içlerinde depolanan nesnelerin türünün kısıtlı olması dışında, listeye çok benzer. Tür, nesne oluşturma sırasında, tek bir karakter olan bir tür kodu kullanılarak belirtilir.


18

appendbir listeye bir öğe eklemektir. Listeyi yeni listeyle genişletmek istiyorsanız kullanmanız gereken extend.

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

4
Sonuçların neden farklı olduğunun oldukça açık olduğunu düşündüm çünkü işlemler aynı değil! eğer öyle görünürse +ve extenddüşünecek bir şeyimiz olacak farklı sonuçlar üretirse.
SilentGhost

1
+1: Neden "neden" sorularını sevmiyorum: appendve +farklılar. Bu yüzden. Bu cevabı beğendim çünkü daha mantıklı olan ne yapacağını teklif ediyor.
S.Lott

Bu site sorulan soruları cevaplamakla ilgili değil mi? İnsanlar, PHP'nin neden PHP olarak adlandırıldığını ve neden __lt__Python'da aşırı yüklenemediğini soruyor (günümüzde olabilir). Neden soruları en önemli olanlardır, ancak çoğu zaman cevaplanması en zor olanlardır: kılavuza bir işaretçi değil, özü isterler. Ve tabii ki: Bir soru (benim en sevmediğim), sonra ;-) cevap yok sevmediğim eğer
Abel

Daha fazla gösteri için, belki göster c += [c]ve c.append(c[:])çok.
ephemient

2
@Abel: Neden a+b != a*b? Farklı operasyonlardır. Cevap bu. "Neden", "Nasıl doğru şekilde ekleyebilirim?" Gibi diğer sorular kadar yararlı değildir. Veya "Sonsuz özyinelemeye götüren bu ekin nesi var?" "X'e ne yapmalıyım" veya "X'i yaptığımda neyin yanlış gitti" formundaki sorular? Veya "X yerine ne yapmalıyım" da bir kişinin öğrenmesine yardımcı olacak, ancak odaklanmış, kullanılabilir, eyleme geçirilebilir yanıtlar sağlayacaktır.
S.Lott

8

Python listeleri heterojendir, yani aynı listedeki öğeler herhangi bir nesne türü olabilir. İfade: her ne c.append(c)olursa olsun nesneyi clisteye ekler . Listenin kendisini listenin bir üyesi yapması durumunda.

İfade, c += ciki listeyi birbirine ekler ve sonucu değişkene atar c. Aşırı yüklenmiş +operatör, içerikleri birinci listedeki öğeler ve ikinci listedeki öğeler olan yeni bir liste oluşturmak için listelerde tanımlanır.

Yani bunlar, tasarım gereği farklı şeyler yapmak için kullanılan gerçekten sadece farklı ifadeler.


7

Aradığınız yöntem extend(). Python belgelerinden :

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).


2

Belgelere bakın :

list.append (x)

  • Listenin sonuna bir öğe ekleyin; [len (a):] = [x] 'e eşdeğer.

list.extend (L) - Verilen listedeki tüm öğeleri ekleyerek listeyi genişletir; a [len (a):] = L.'ye eşdeğerdir.

c.append(c)c'yi bir öğe olarak kendisine "ekler" . Liste bir başvuru türü olduğundan, bu yinelemeli bir veri yapısı oluşturur.

c += ceşdeğerdir , c'nin öğelerini c'yeextend(c) ekler .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.