Ne anlama geliyor?


97

Bazı Python kodunu analiz ediyorum ve ne olduğunu bilmiyorum

pop = population[:]

anlamına geliyor. Java'daki dizi listeleri gibi mi yoksa iki boyutlu bir dizi mi?


1
Bununla ilgili olarak, bir listeyi temizlemek yalnızca del pop [:] veya pop [:] = [] yaparak mümkündür, pop.clear () .. (dicts'te yaptığınız gibi) değil.
Macke

Python dilimiyle ilgili iyi SO tartışması: stackoverflow.com/questions/509211/…
Scott C Wilson

@Macke: Not: Python 3.3'ten itibaren, lists sağlamak clearve copyyöntemleri yapmak del mylist[:]veya mylist[:]sırasıyla eşdeğerdir . Bunlar genel olarak değiştirilebilir diziler için gerekli değildir, bu nedenle rastgele değiştirilebilir bir dizi elde ederseniz, dilim tabanlı işlemlere bağlı kalmak istersiniz, ancak adlandırılmış yöntemler en azından kullanılabilir list.
ShadowRanger

@ShadowRanger Evet, 9 yıl sonra. :-)
Macke

Yanıtlar:


111

Bu, bir dilim gösterimi örneğidir ve ne yaptığı, türüne bağlıdır population. Eğer populationbir listedir bu satır yaratacak sığ kopya listesinin. tupleVeya a türündeki bir nesne striçin hiçbir şey yapmaz (satır aynısını olmadan yapacaktır [:]) ve bir NumPy dizisi için (örneğin) aynı verilere yeni bir görünüm oluşturacaktır.


14
Her ihtimale karşı: dilim sığ bir kopya döndürür.
André Caron

4
@ilius: Belki l.copy()daha okunabilir, ama işe yaramayacak.
Sven Marnach

13
list(l)her zaman işe yarar, daha okunabilirdir venumpy.array
Rosh Oxymoron

1
@Eli: Evet, yanında list.clear(). Yine de, bu SO ile ilgili bu tür soruların önemli ölçüde azalmasına yol açana kadar biraz zaman alacaktır. :)
Sven Marnach

1
@MichaelGraczyk: Burada NumPy dizilerinden bahsettiğinizi varsayıyorum. Kullanmaktansa A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], neredeyse her zaman tercih ederim numpy.rollaxis(A, axis, 0)[k]. Genel olarak, doğrudan slice()nesneler oluşturmanız gereken bir kullanım durumuyla nadiren karşılaştım . Bunlara yine de ihtiyacınız varsa, NumPy s_yardımcıyı bunları oluşturmanın alternatif bir yolu olarak sağlar.
Sven Marnach

28

Ayrıca, bir liste diliminin genel olarak listenin bir parçasının bir kopyasını oluşturduğunu bilmek de yardımcı olabilir. Örneğin population[2:4], [2] popülasyonunu ve [3] popülasyonunu içeren bir liste döndürecektir (dilimleme sağa özeldir). population[:]Varsayılan olarak sırasıyla 0 ve uzunluk (popülasyon) olduğu gibi sol ve sağ dizini bir kenara bırakarak tüm listeyi seçer. Dolayısıyla bu, bir listenin kopyasını yapmak için kullanılan yaygın bir deyimdir.


15

iyi ... bu gerçekten içeriğe bağlı. Sonuç olarak, bu geçer slicenesne ( slice(None,None,None)aşağıdaki yöntemlerden birine) __getitem__, __setitem__ya da __delitem__. (Aslında, nesnede bir __getslice__yerine kullanılacak olan bir a varsa __getitem__, ancak artık kullanımdan kaldırılmıştır ve kullanılmamalıdır).

Nesneler dilimle istediklerini yapabilir.

Bağlamında:

x = obj[:]

Bu, obj.__getitem__iletilen dilim nesnesiyle birlikte çağırır . Aslında bu, şuna tamamen eşdeğerdir:

x = obj[slice(None,None,None)]

(ilki muhtemelen daha etkilidir çünkü kurucuyu aramak zorunda değildir slice- Her şey bayt kodu ile yapılır).

Çoğu nesne için bu, dizinin bir bölümünün yüzeysel bir kopyasını oluşturmanın bir yoludur.

Sonraki:

x[:] = obj

Öğeleri (çağırır __setitem__) temel alarak ayarlamanın bir yoludur obj.

ve sanırım ne olduğunu tahmin edebilirsiniz:

del x[:]

arar ;-).

Ayrıca farklı dilimler de geçirebilirsiniz:

x[1:4]

yapılar slice(1,4,None)

x[::-1]

yapılar slice(None,None,-1)vb. Daha fazla okuma: Python'un dilim gösterimini açıklayın



6

Zaten var olan listeye yeni bir ad atamak yerine, listenin bir kopyasını oluşturur.


5

[:]
sınırlayıcı veya dizide dilimleme için kullanılır, karma
örneğin:
[1: 5] 1 kapsayıcı ile 5 dışlayıcı arasındaki değerleri görüntülemek için, yani 1-4
[başlangıç: bitiş]

temelde dilimleme için dizide kullanılır, parantezin anlamı olan değişkeni kabul edin değer veya anahtar görüntülenecek ve ":" tüm diziyi paketler halinde sınırlamak veya dilimlemek için kullanılır.


1
Zaten 5 benzer cevabı olan ve hatta kabul edilmiş bir cevabı olan bu kadar eski bir soruyu çarpmak için bir neden yok ... Ayrıca, a[1:5]2-4 değil, 1-4 öğelerini döndürür.
Skamah One

@SkamahOne Oh bilmiyorum. Belki bu durumda değil ama ölü sorular sormanın değerli olabileceği zamanlar vardır. Farklı içgörüler, farklı ifadeler vb. Bu durumda cevabı düzelttiniz ve umarım onlar da bir şeyler öğrenmişlerdir.
Pryftan
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.