Những cách khác nhau để xóa danh sách


207

Có bất kỳ lý do để làm bất cứ điều gì phức tạp hơn một trong hai dòng này khi bạn muốn xóa một danh sách trong Python?

old_list = []
old_list = list()

Lý do tôi hỏi là tôi chỉ thấy điều này trong một số mã đang chạy:

del old_list[ 0:len(old_list) ]

1
Tại sao anh làm điều này? Thu gom rác hoạt động. Tại sao không đơn giản bỏ qua giá trị danh sách cũ và để Python tự động dọn sạch?
S.Lott

40
@ S.Lott: Người đăng đã không viết mã và đang hỏi tại sao người viết ban đầu có thể đã làm như vậy.
John Fouhy

1
Bạn cũng có thể làm: while l: l.pop ()
RoadieRich

12
CƯỜI LỚN. Tôi chắc chắn rằng đó là hiệu quả.
FogleBird

18
Không liên quan đến câu hỏi của bạn, nhưng bạn không nên sử dụng len khi chỉ định một lát cắt. a[:x]có nghĩa là bắt đầu x và a[x:]có nghĩa là x kết thúc. a[ 0:len(a) ]có thể được viết là a[:]. Bạn cũng có thể sử dụng phủ định để đếm từ cuối ( a[-1]là yếu tố cuối cùng).
idbrii

Câu trả lời:


356

Xóa danh sách tại chỗ sẽ ảnh hưởng đến tất cả các tham chiếu khác của cùng danh sách.

Ví dụ: phương pháp này không ảnh hưởng đến các tham chiếu khác:

>>> a = [1, 2, 3]
>>> b = a
>>> a = []
>>> print(a)
[]
>>> print(b)
[1, 2, 3]

Nhưng cái này thì có:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]      # equivalent to   del a[0:len(a)]
>>> print(a)
[]
>>> print(b)
[]
>>> a is b
True

Bạn cũng có thể làm:

>>> a[:] = []

86
Bạn cũng có thể làmdel a[:]
idbrii

1
Tại sao cái đầu tiên sẽ chỉ ảnh hưởng a? Tôi nghĩ abtham khảo cùng một đối tượng ... Chỉ muốn biết tại sao. Cảm ơn.
Alston

37
Với python 3.3 trở lên bạn có thể đi cùng a.clear(), không vấn đề gì!
Marek Lewandowski

4
@Stallman vì trước tiên, bạn đang thay đổi một tham chiếu cho 'a' để trỏ đến mảng mới, không xóa một mảng và b vẫn chỉ ra một tham chiếu cũ
Pax0r

4
Sẽ thật tuyệt nếu ai đó có thể chỉ ra sự khác biệt về hiệu suất giữa các phương thức đó!
Suanmeiguo 24/07/2015

37

Làm alist = []không xóa danh sách, chỉ tạo một danh sách trống và liên kết nó với biến alist. Danh sách cũ sẽ vẫn tồn tại nếu nó có các ràng buộc khác.

Để thực sự xóa một danh sách tại chỗ , bạn có thể sử dụng bất kỳ cách nào sau đây:

  1. alist.clear() # Python 3.3+, most obvious
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0 # fastest

Xem trang tài liệu Kiểu trình tự Mutable để biết thêm chi tiết.


2
Tôi đã thử nghiệm và alist * = 0 là nhanh nhất, nhanh nhất tiếp theo là alist.clear () và hai phương thức khác đều nhanh như nhau. Bạn có thể giải thích tại sao alist * = 0 là nhanh nhất?
Jenny

3
@Jenny: Đơn giản là nó sử dụng ít opcodes (hoặc ít tốn kém hơn) dưới mui xe. Ví dụ, phiên bản toán tử không cần tra cứu bất kỳ tên phương thức hoặc xây dựng các lát.
Eugene Yarmash

"Nên có một-- và tốt nhất là chỉ có một cách rõ ràng để làm điều đó." Python đang tỏa sáng ở đây :)
Nik O'Lai

36

Có một cách rất đơn giản để xóa danh sách trăn. Sử dụng del list_name [:] .

Ví dụ:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a, b
[] []

13

Tôi nhận ra rằng del sẽ cung cấp cho bạn bộ nhớ trở lại, trong khi việc gán một danh sách mới sẽ khiến danh sách cũ chỉ bị xóa khi gc ran.matter.

Điều này có thể hữu ích cho các danh sách lớn, nhưng đối với danh sách nhỏ thì không đáng kể.

Chỉnh sửa : Là Algorias, nó không thành vấn đề.

Lưu ý rằng

del old_list[ 0:len(old_list) ]

tương đương với

del old_list[:]

2
gc không chạy theo chu kỳ. Danh sách này được giải phóng ngay sau khi tham chiếu cuối cùng của nó bị hủy.
Algorias

2
Algorias: điều đó đúng với CPython, nhưng có thể không đúng với các triển khai khác.
mhsmith

2
del old_list [0: len (old_list)] và del old_list [:] có cùng kết quả, nhưng cái sau nhanh hơn (được kiểm tra trong Python 2.6)
Roy Nieterau

6
del list[:] 

Sẽ xóa các giá trị của biến danh sách đó

del list

Sẽ tự xóa biến khỏi bộ nhớ


5

Có hai trường hợp bạn có thể muốn xóa danh sách:

  1. Bạn muốn sử dụng tên old_list xa hơn trong mã của bạn;
  2. Bạn muốn danh sách cũ được thu gom rác càng sớm càng tốt để giải phóng bộ nhớ;

Trong trường hợp 1, bạn chỉ cần tiếp tục với các xác nhận:

    old_list = []    # or whatever you want it to be equal to

Trong trường hợp 2, delcâu lệnh sẽ giảm số tham chiếu đến đối tượng danh sách mà tên old listtrỏ tại. Nếu đối tượng danh sách chỉ được chỉ bởi tên old_listtại, số tham chiếu sẽ là 0 và đối tượng sẽ được giải phóng để thu gom rác.

    del old_list

3

Nếu bạn đang xóa danh sách, rõ ràng, bạn không cần danh sách nữa. Nếu vậy, bạn chỉ có thể xóa toàn bộ danh sách bằng phương pháp del đơn giản.

a = [1, 3, 5, 6]
del a # This will entirely delete a(the list).

Nhưng trong trường hợp, bạn cần nó một lần nữa, bạn có thể xác định lại nó. Hoặc chỉ đơn giản là xóa các yếu tố của nó bằng cách

del a[:]

-4

một giải pháp khác hoạt động tốt là tạo danh sách trống dưới dạng danh sách trống tham chiếu.

empt_list = []

ví dụ bạn có một danh sách như a_list = [1,2,3]. Để xóa nó, chỉ cần làm như sau:

a_list = list(empt_list)

điều này sẽ làm cho a_listmột danh sách trống giống như empt_list.


Không có lý do để tạo empt_list. Chỉ cần sử dụng a_list = list ().
Daniel Harding
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.