Terkait, menghapus daftar hanya mungkin dengan melakukan del pop [:] atau pop [:] = [], bukan pop.clear () .. (seperti yang Anda lakukan dengan dicts).
Ini adalah contoh notasi irisan, dan fungsinya tergantung pada jenisnya population. Jika populationberupa daftar, baris ini akan membuat salinan daftar yang dangkal . Untuk objek bertipe tupleatau a str, itu tidak akan melakukan apa-apa (garis akan melakukan hal yang sama tanpa [:]), dan untuk array (katakanlah) NumPy, itu akan membuat tampilan baru ke data yang sama.
Untuk berjaga-jaga: potongan mengembalikan salinan dangkal.
André Caron
4
@ilius: Mungkin l.copy()lebih mudah dibaca, tetapi tidak akan berhasil.
Sven Marnach
13
list(l)selalu berfungsi, lebih mudah dibaca, dan dijamin akan mengembalikan salinannya bahkan dengan sesuatu sepertinumpy.array
Rosh Oxymoron
1
@Eli: Ya, di samping list.clear(). Ini akan memakan waktu, meskipun, sampai ini akan mengarah pada pengurangan yang signifikan dari pertanyaan semacam ini pada SO. :)
Sven Marnach
1
@MichaelGraczyk: Saya berasumsi Anda berbicara tentang array NumPy di sini. Daripada menggunakan A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], saya hampir selalu lebih suka numpy.rollaxis(A, axis, 0)[k]. Secara umum, saya jarang menemukan kasus penggunaan di mana Anda perlu membuat slice()objek secara langsung . Jika Anda tetap membutuhkannya, NumPy menyediakan s_helper sebagai cara alternatif untuk membuatnya.
Sven Marnach
27
Mungkin juga membantu untuk mengetahui bahwa potongan daftar secara umum membuat salinan dari bagian daftar. Misalnya population[2:4]akan mengembalikan daftar yang berisi populasi [2] dan populasi [3] (pemotongan eksklusif kanan). Meninggalkan indeks kiri dan kanan, karena population[:]defaultnya masing-masing ke 0 dan panjang (populasi), dengan demikian memilih seluruh daftar. Oleh karena itu, ini adalah ungkapan umum untuk membuat salinan daftar.
baik ... ini sangat tergantung pada konteksnya. Pada akhirnya, itu melewati sliceobjek ( slice(None,None,None)) ke salah satu metode berikut: __getitem__, __setitem__atau __delitem__. (Sebenarnya, jika objek memiliki __getslice__, itu akan digunakan sebagai pengganti __getitem__, tapi sekarang sudah usang dan tidak boleh digunakan).
Objek dapat melakukan apa yang mereka inginkan dengan irisan.
Dalam konteks:
x = obj[:]
Ini akan memanggil obj.__getitem__dengan objek slice yang diteruskan. Faktanya, ini sepenuhnya setara dengan:
x = obj[slice(None,None,None)]
(meskipun yang pertama mungkin lebih efisien karena tidak harus mencari slicekonstruktor - Semuanya dilakukan dalam bytecode).
Untuk sebagian besar objek, ini adalah cara untuk membuat salinan dangkal dari sebagian urutan.
Lanjut:
x[:]= obj
Adalah cara untuk mengatur item (panggilannya __setitem__) berdasarkan obj.
[:]
digunakan untuk pembatas atau pengirisan dalam larik,
misalnya hash :
[1: 5] untuk menampilkan nilai antara 1 inklusif dan 5 eksklusif yaitu 1-4
[start: end]
pada dasarnya digunakan dalam larik untuk mengiris, pahami braket terima variabel yang berarti nilai atau kunci untuk ditampilkan, dan ":" digunakan untuk membatasi atau mengiris seluruh array menjadi paket.
Tidak ada alasan untuk menabrak pertanyaan lama yang sudah memiliki 5 jawaban serupa dan bahkan yang diterima ... Selain itu, a[1:5]mengembalikan elemen 1-4, bukan 2-4.
Skamah One
@SkamahOne Oh saya tidak tahu. Mungkin tidak dalam kasus ini, tetapi ada saat-saat di mana hal itu dapat bermanfaat untuk memunculkan pertanyaan-pertanyaan yang sudah mati. Wawasan yang berbeda, kata yang berbeda, dll. Dalam hal ini Anda mengoreksi jawaban dan semoga mereka juga belajar sesuatu.
Jawaban:
Ini adalah contoh notasi irisan, dan fungsinya tergantung pada jenisnya
population
. Jikapopulation
berupa daftar, baris ini akan membuat salinan daftar yang dangkal . Untuk objek bertipetuple
atau astr
, itu tidak akan melakukan apa-apa (garis akan melakukan hal yang sama tanpa[:]
), dan untuk array (katakanlah) NumPy, itu akan membuat tampilan baru ke data yang sama.sumber
l.copy()
lebih mudah dibaca, tetapi tidak akan berhasil.list(l)
selalu berfungsi, lebih mudah dibaca, dan dijamin akan mengembalikan salinannya bahkan dengan sesuatu sepertinumpy.array
list.clear()
. Ini akan memakan waktu, meskipun, sampai ini akan mengarah pada pengurangan yang signifikan dari pertanyaan semacam ini pada SO. :)A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)]
, saya hampir selalu lebih sukanumpy.rollaxis(A, axis, 0)[k]
. Secara umum, saya jarang menemukan kasus penggunaan di mana Anda perlu membuatslice()
objek secara langsung . Jika Anda tetap membutuhkannya, NumPy menyediakans_
helper sebagai cara alternatif untuk membuatnya.Mungkin juga membantu untuk mengetahui bahwa potongan daftar secara umum membuat salinan dari bagian daftar. Misalnya
population[2:4]
akan mengembalikan daftar yang berisi populasi [2] dan populasi [3] (pemotongan eksklusif kanan). Meninggalkan indeks kiri dan kanan, karenapopulation[:]
defaultnya masing-masing ke 0 dan panjang (populasi), dengan demikian memilih seluruh daftar. Oleh karena itu, ini adalah ungkapan umum untuk membuat salinan daftar.sumber
baik ... ini sangat tergantung pada konteksnya. Pada akhirnya, itu melewati
slice
objek (slice(None,None,None)
) ke salah satu metode berikut:__getitem__
,__setitem__
atau__delitem__
. (Sebenarnya, jika objek memiliki__getslice__
, itu akan digunakan sebagai pengganti__getitem__
, tapi sekarang sudah usang dan tidak boleh digunakan).Objek dapat melakukan apa yang mereka inginkan dengan irisan.
Dalam konteks:
Ini akan memanggil
obj.__getitem__
dengan objek slice yang diteruskan. Faktanya, ini sepenuhnya setara dengan:(meskipun yang pertama mungkin lebih efisien karena tidak harus mencari
slice
konstruktor - Semuanya dilakukan dalam bytecode).Untuk sebagian besar objek, ini adalah cara untuk membuat salinan dangkal dari sebagian urutan.
Lanjut:
Adalah cara untuk mengatur item (panggilannya
__setitem__
) berdasarkanobj
.dan, saya pikir Anda mungkin bisa menebak apa:
panggilan ;-).
Anda juga dapat memberikan irisan yang berbeda:
konstruksi
slice(1,4,None)
konstruksi
slice(None,None,-1)
dan lain sebagainya. Bacaan lebih lanjut: Jelaskan notasi irisan Pythonsumber
Ini adalah potongan dari awal urutan sampai akhir, biasanya menghasilkan salinan yang dangkal.
(Yah, ini lebih dari itu , tetapi Anda belum perlu peduli.)
sumber
Ini membuat salinan daftar, versus hanya menetapkan nama baru untuk daftar yang sudah ada.
sumber
[:]
digunakan untuk pembatas atau pengirisan dalam larik,
misalnya hash :
[1: 5] untuk menampilkan nilai antara 1 inklusif dan 5 eksklusif yaitu 1-4
[start: end]
pada dasarnya digunakan dalam larik untuk mengiris, pahami braket terima variabel yang berarti nilai atau kunci untuk ditampilkan, dan ":" digunakan untuk membatasi atau mengiris seluruh array menjadi paket.
sumber
a[1:5]
mengembalikan elemen 1-4, bukan 2-4.