Apa maksudnya?

95

Saya menganalisis beberapa kode Python dan saya tidak tahu apa

pop = population[:]

cara. Apakah itu seperti daftar array di Java atau seperti array dua dimensi?

andriy
sumber
1
Terkait, menghapus daftar hanya mungkin dengan melakukan del pop [:] atau pop [:] = [], bukan pop.clear () .. (seperti yang Anda lakukan dengan dicts).
Macke
Diskusi SO yang baik tentang potongan Python: stackoverflow.com/questions/509211/…
Scott C Wilson

Jawaban:

109

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.

Sven Marnach
sumber
14
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.

ThomasH
sumber
15

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.

dan, saya pikir Anda mungkin bisa menebak apa:

del x[:]

panggilan ;-).

Anda juga dapat memberikan irisan yang berbeda:

x[1:4]

konstruksi slice(1,4,None)

x[::-1]

konstruksi slice(None,None,-1)dan lain sebagainya. Bacaan lebih lanjut: Jelaskan notasi irisan Python

mgilson.dll
sumber
10

Ini adalah potongan dari awal urutan sampai akhir, biasanya menghasilkan salinan yang dangkal.

(Yah, ini lebih dari itu , tetapi Anda belum perlu peduli.)

Ignacio Vazquez-Abrams
sumber
6

Ini membuat salinan daftar, versus hanya menetapkan nama baru untuk daftar yang sudah ada.

Jim Brissom
sumber
5

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

Vijay Balkrishna konduskar
sumber
1
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.
Pryftan