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?
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?
Câu trả lời:
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 population
là 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 tuple
hoặ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.
l.copy()
thể dễ đọc hơn, nhưng nó sẽ không hoạt động.
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
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. :)
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.
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.
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 slice
tạ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
Nó là một lát cắt từ đầu đến cuối của chuỗi, thường tạo ra một bản sao nông.
(Chà, còn hơn thế nữa , nhưng bạn chưa cần quan tâm.)
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ó.
[:]
đượ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.
a[1:5]
trả về các phần tử 1-4, không phải 2-4.