Có vẻ như "bẩn" làm trống một danh sách theo cách này:
while len(alist) > 0 : alist.pop()
Có một cách rõ ràng tồn tại để làm điều đó?
Có vẻ như "bẩn" làm trống một danh sách theo cách này:
while len(alist) > 0 : alist.pop()
Có một cách rõ ràng tồn tại để làm điều đó?
Câu trả lời:
Điều này thực sự xóa nội dung khỏi danh sách, nhưng không thay thế nhãn cũ bằng danh sách trống mới:
del lst[:]
Đây là một ví dụ:
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
Để hoàn thiện, việc gán lát có tác dụng tương tự:
lst[:] = []
Nó cũng có thể được sử dụng để thu nhỏ một phần của danh sách trong khi thay thế một phần cùng một lúc (nhưng đó là ngoài phạm vi của câu hỏi).
Lưu ý rằng việc thực hiện lst = []
không làm trống danh sách, chỉ tạo một đối tượng mới và liên kết nó với biến lst
, nhưng danh sách cũ sẽ vẫn có các phần tử tương tự và hiệu ứng sẽ rõ ràng nếu nó có các ràng buộc biến khác.
Nếu bạn đang chạy Python 3.3 hoặc cao hơn, bạn có thể sử dụng các clear()
phương pháp list
, đó là song song với clear()
của dict
, set
, deque
và các loại thùng chứa có thể thay đổi khác:
alist.clear() # removes all items from alist (equivalent to del alist[:])
Theo trang tài liệu được liên kết, điều tương tự cũng có thể đạt được với alist *= 0
.
Tóm lại, có bốn cách tương đương để xóa danh sách tại chỗ (hoàn toàn trái ngược với Zen của Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
Bạn có thể thử:
alist[:] = []
Có nghĩa là: Splice trong danh sách []
(0 phần tử) tại vị trí [:]
(tất cả các chỉ mục từ đầu đến cuối)
[:] Là toán tử lát. Xem câu hỏi này để biết thêm thông tin.
alist = []
?
alist
bằng một danh sách khác sẽ trống. Nếu bất cứ ai khác có một tham chiếu đến danh sách ban đầu, thì nó vẫn như cũ (nghĩa là nó chứa bất cứ thứ gì có trong đó để bắt đầu)
alist.clear()
hoặc alist[:] = []
giúp kiểm tra đó alist
thực sự là một danh sách. Nói rằng bạn đã alist
trở về từ một chức năng foo()
. Bạn nghĩ foo
trả về một danh sách nhưng thực sự nó trả lại a None
. Sử dụng alist = []
không thể bắt lỗi đó.
Hóa ra với python 2.5.2, del l[:]
chậm hơn một chút so với l[:] = []
1.1 usec.
$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2
.clear()
, del b[:]
Và b[:]=[]
tất cả chạy cùng ( b[:]=[]
là hơi chậm.
lst *= 0
có tác dụng tương tự như
lst[:] = []
Nó đơn giản hơn một chút và có thể dễ nhớ hơn. Khác hơn là không có nhiều điều để nói
Hiệu quả dường như là như nhau
0
sẽ có cùng tác dụng. Mặc dù đây là một mẹo khá gọn gàng, tôi hơi buồn, vì nó không nhận được nhiều sự chú ý ..
list = []
sẽ thiết lập lại list
vào một danh sách trống.
Lưu ý rằng bạn thường không nên bỏ qua các tên hàm dành riêng, chẳng hạn như list
, đó là hàm tạo cho một đối tượng danh sách - ví dụ, bạn có thể sử dụng lst
hoặc list_
thay vào đó.
list
. Nếu bạn mong đợi một chức năng sửa đổi một danh sách được thông qua (ví dụ), điều này sẽ không làm những gì bạn muốn.
Một mã đơn giản khác bạn có thể sử dụng (tùy thuộc vào tình huống của bạn) là:
index=len(list)-1
while index>=0:
del list[index]
index-=1
Bạn phải bắt đầu chỉ mục ở độ dài của danh sách và đi ngược lại so với chỉ số ở mức 0, vì điều đó sẽ khiến bạn kết thúc với chỉ số bằng với độ dài của danh sách khi nó chỉ bị cắt làm đôi.
Ngoài ra, hãy chắc chắn rằng dòng while có dấu "lớn hơn hoặc bằng". Bỏ qua nó sẽ để lại cho bạn danh sách [0] còn lại.