Nghĩa là gì?


95

Tôi đang phân tích một số mã Python và tôi không biết

pop = population[:]

có nghĩa. Nó giống như danh sách mảng trong Java hay giống như mảng hai chiều?


1
Có liên quan, chỉ có thể xóa danh sách bằng cách thực hiện del pop [:] hoặc pop [:] = [], không phải pop.clear () .. (như bạn làm với dicts).
Macke

Thảo luận tốt SO của Python lát: stackoverflow.com/questions/509211/...
Scott C Wilson

Câu trả lời:


109

Nó là một ví dụ về ký hiệu lát cắt, và những gì nó làm tùy thuộc vào loại population. Nếu populationlà một danh sách, dòng này sẽ tạo một bản sao ngắn của danh sách. Đối với một đối tượng kiểu tuplehoặc a str, nó sẽ không làm gì cả (dòng sẽ làm tương tự mà không có [:]), và đối với một mảng (giả sử) NumPy, nó sẽ tạo một dạng xem mới cho cùng một dữ liệu.


14
Chỉ trong trường hợp: lát cắt trả về một bản sao cạn.
André Caron

4
@ilius: Có l.copy()thể dễ đọc hơn, nhưng nó sẽ không hoạt động.
Sven Marnach

13
list(l)luôn hoạt động, dễ đọc hơn và được đảm bảo trả lại một bản sao ngay cả với những thứ như thếnumpy.array
Rosh Oxymoron

1
@Eli: Có, cùng với list.clear(). Tuy nhiên, sẽ mất một thời gian cho đến khi điều này sẽ dẫn đến việc giảm đáng kể loại câu hỏi này trên SO. :)
Sven Marnach

1
@MichaelGraczyk: Tôi giả sử bạn đang nói về mảng NumPy ở đây. Thay vì sử dụng A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], tôi hầu như luôn thích hơn numpy.rollaxis(A, axis, 0)[k]. Nói chung, tôi hiếm khi gặp trường hợp sử dụng mà bạn cần phải trực tiếp tạo slice()các đối tượng. Nếu bạn cần chúng, NumPy cung cấp trình s_trợ giúp như một cách thay thế để tạo chúng.
Sven Marnach

27

Cũng có thể hữu ích khi biết rằng một lát danh sách nói chung tạo ra một bản sao của một phần danh sách. Ví dụ: population[2:4]sẽ trả về một danh sách chứa dân số [2] và dân số [3] (việc cắt lát là loại trừ bên phải). Bỏ chỉ mục bên trái và bên phải, vì population[:]chúng được mặc định là 0 và độ dài (dân số) tương ứng, do đó chọn toàn bộ danh sách. Do đó, đây là một thành ngữ phổ biến để tạo một bản sao của một danh sách.


15

tốt ... điều này thực sự phụ thuộc vào bối cảnh. Cuối cùng, nó đi một sliceđối tượng ( slice(None,None,None)) đến một trong các phương pháp sau: __getitem__, __setitem__hoặc __delitem__. (Trên thực tế, nếu đối tượng có a __getslice__, thì sẽ được sử dụng thay vì __getitem__, nhưng điều đó hiện không được dùng nữa và không nên sử dụng).

Các đối tượng có thể làm những gì họ muốn với lát cắt.

Trong ngữ cảnh của:

x = obj[:]

Điều này sẽ gọi obj.__getitem__với đối tượng lát cắt được truyền vào. Thực tế, điều này hoàn toàn tương đương với:

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

(mặc dù cái trước có lẽ hiệu quả hơn vì nó không phải tra cứu hàm slicetạo - Tất cả đều được thực hiện trong bytecode).

Đối với hầu hết các đối tượng, đây là một cách để tạo một bản sao nông của một phần của chuỗi.

Kế tiếp:

x[:] = obj

Là một cách để thiết lập các mục (nó gọi __setitem__) dựa trên obj.

và, tôi nghĩ bạn có thể đoán được điều gì:

del x[:]

cuộc gọi ;-).

Bạn cũng có thể chuyển các lát khác nhau:

x[1:4]

cấu trúc slice(1,4,None)

x[::-1]

cấu trúc slice(None,None,-1), v.v. Đọc thêm: Giải thích ký hiệu lát cắt của Python



6

Nó tạo ra một bản sao của danh sách, thay vì chỉ gán một tên mới cho danh sách đã có.


5

[:]
được sử dụng cho giới hạn hoặc cắt trong mảng,
ví dụ:
[1: 5] để hiển thị các giá trị từ 1 bao gồm và 5 loại trừ, tức là 1-4
[bắt đầu: kết thúc]

về cơ bản được sử dụng trong mảng để cắt, hiểu biến chấp nhận dấu ngoặc có nghĩa là giá trị hoặc khóa để hiển thị và ":" được sử dụng để giới hạn hoặc cắt toàn bộ mảng thành các gói.


1
Không có lý do gì để đặt một câu hỏi cũ như vậy đã có 5 câu trả lời tương tự và thậm chí một câu được chấp nhận ... Bên cạnh đó, a[1:5]trả về các phần tử 1-4, không phải 2-4.
Skamah One

@SkamahOne Ồ, tôi không biết. Có thể không phải trong trường hợp này nhưng đôi khi nó có thể có giá trị để đặt ra những câu hỏi chết chóc. Cái nhìn sâu sắc khác, cách diễn đạt khác nhau, v.v. Trong trường hợp này, bạn đã sửa câu trả lời và hy vọng họ cũng học được điều gì đó.
Pryftan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.