List append () yönteminin yeni listeyi döndürmesine nasıl izin verilir


86

Bunun gibi bir şey yapmak istiyorum:

myList = [10, 20, 30]
yourList = myList.append(40)

Ne yazık ki, liste eki değiştirilen listeyi döndürmez.

Peki, appendyeni listeye geri dönmeme nasıl izin verebilirim ?

Yanıtlar:


149

Ekleme yerine birleştirme kullanmayın:

yourList = myList + [40]

Bu yeni bir liste döndürür ; myListetkilenmeyecek. Eğer olması gerekiyorsa myListetkilenen sıra birini kullanabilirsiniz .append()neyse, sonra atamak yourList(bir kopyasını) ayrı myList.


2
aynı liste yerine append()geri dönmenin ardındaki mantık ne olabilirdi None? Hangi zen ilkesini ihlal ederdi?
Ciprian Tomoiagă

3
@CiprianTomoiaga: bakınız en.wikipedia.org/wiki/Command%E2%80%93query_separation ; list.appendbir komuttur, sorgu değil.
Martijn Pieters

2
@CiprianTomoiaga: Python BDFL'den gelen bu e-postaya da bakın .
Martijn Pieters

2
@Dieblitzen: doğru, bu yüzden OCaml bağlantılı listeleri kullanır ve bunları birbirine bağlar. Python listeleri değişmez değildir, bu yüzden bunu onlarla yapamazsınız ve dahası, diğer her şey değiştirilebilir olabilir . Bir OCaml listesi değişmez nesneler içeriyor olsa da, Python'da tuple gibi değişmez nesnelerin içerikleri yine de değiştirilebilir, bu nedenle içeriği birleştirme sırasında diğer kaplarla paylaşamazsınız.
Martijn Pieters

2
@Dieblitzen: Bu yüzden Python'da bir birleştirme işleminin geçerli olması için sığ bir kopya oluşturmalı ve O (N) zamanını ödemelisiniz. Üzgünüm, daha açık konuşmalıydım.
Martijn Pieters

22

Python 3'te eskisini açıp yeni eleman ekleyerek yeni liste oluşturabilirsiniz:

a = [1,2,3]
b = [*a,4] # b = [1,2,3,4] 

ne zaman yaparsan:

myList + [40]

Aslında 3 listeniz var.


1
Ve biraz daha hızlı
aerobiomat

6

list.appendyerleşiktir ve bu nedenle değiştirilemez. Ancak dışında başka bir şey kullanmak appendistiyorsanız, deneyebilirsiniz +:

In [106]: myList = [10,20,30]

In [107]: yourList = myList + [40]

In [108]: print myList
[10, 20, 30]

In [109]: print yourList
[10, 20, 30, 40]

Elbette bunun dezavantajı, bundan çok daha fazla zaman alan yeni bir listenin oluşturulmasıdır. append

Bu yardımcı olur umarım


Ama yerleşik sınıflandırma yapılabilir ve daha sonra her şey :) gider
Marcin Wyszynski

@MarcinWyszynski: evet, ancak sadece alt sınıf içinde değiştirilebilirler. Yerleşik bir nesnenin / sınıfın yerleşik yönteminin üzerine nadiren yazılabilir
inspectorG4dget

3
Kendi akıl sağlığınız ve iş arkadaşlarınızın aklı için bunu asla yapmamalısınız :)
Marcin Wyszynski

2

Yerleşik liste türünü alt sınıflandırabilir ve 'ekleme' yöntemini yeniden tanımlayabilirsiniz. Daha da iyisi, yapmasını istediğiniz şeyi yapacak yeni bir tane oluşturun. Aşağıda, yeniden tanımlanmış bir 'ekleme' yönteminin kodu verilmiştir.

#!/usr/bin/env python

class MyList(list):

  def append(self, element):
    return MyList(self + [element])


def main():
  l = MyList()
  l1 = l.append(1)
  l2 = l1.append(2)
  l3 = l2.append(3)
  print "Original list: %s, type %s" % (l, l.__class__.__name__)
  print "List 1: %s, type %s" % (l1, l1.__class__.__name__)
  print "List 2: %s, type %s" % (l2, l2.__class__.__name__)
  print "List 3: %s, type %s" % (l3, l3.__class__.__name__)


if __name__ == '__main__':
  main()

Umarım yardımcı olur.


2

Kullanmayı deneyin itertools.chain(myList, [40]). Bu, yeni bir liste tahsis etmek yerine bir jeneratörü bir dizi olarak döndürecektir. Esasen, ilk yinelenebilir öğeden tükenene kadar tüm öğeleri döndürür, ardından tüm yinelenebilir öğeler tükenene kadar sonraki yinelenebilir duruma geçer.


1

Storstamp'ın cevabını genişletmek için

Sadece myList.append (40) yapmanız gerekir

Orijinal listeye ekleyecek, şimdi orijinal listeyi içeren değişkeni döndürebilirsiniz.

Çok büyük listelerle çalışıyorsanız, gidilecek yol budur.


-5

Sadece myList.append (40) yapmanız gerekir

Yeni bir liste döndürmeyecek, orijinal listeye ekleyecektir.

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.