2009-05-12 33 views
159

Có lý do gì để 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 danh sách bằng Python không?Các cách khác nhau để xóa danh sách

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ã chạy:

del old_list[ 0:len(old_list) ] 
+1

Tại sao bạn làm điều này? Garbage Collection hoạt động. Tại sao không đơn giản bỏ qua giá trị danh sách cũ và để cho Python tự động dọn dẹp nó? –

+32

@ S.Lott: Người đăng không viết mã và hỏi tại sao người viết gốc có thể đã làm như vậy. –

+14

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. 'a [: x]' có nghĩa là bắt đầu x và 'a [x:]' 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 âm bản để đếm từ đầu ('a [-1]' là phần tử cuối cùng). – idbrii

Trả lời

303

Xoá danh sách ở vị trí sẽ ảnh hưởng đến tất cả các tài liệu tham khảo khác của cùng một danh sách.

Ví dụ, phương pháp này không ảnh hưởng đến tài liệu tham khảo khác:

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

Nhưng có một điều này:

>>> 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[:] = [] 
+6

Rất tiếc, bạn học được điều gì đó mới mẻ mỗi ngày. –

+80

Bạn cũng có thể làm 'del a [:]' – idbrii

+1

Tại sao ảnh đầu tiên chỉ ảnh hưởng đến 'a'? Tôi nghĩ rằng 'a' và' b' tham chiếu đến cùng một đối tượng ... Chỉ muốn biết tại sao. Cảm ơn. – Stallman

11

Nó xuất hiện với tôi rằng del sẽ cung cấp cho bạn bộ nhớ trở lại, trong khi gán một danh sách mới sẽ làm cho cái cũ là chỉ bị xóa khi gc runs.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ỏ, danh sách nhỏ sẽ không đáng kể.

Chỉnh sửa: Là thuật toán, không quan trọng.

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 được giải phóng ngay sau khi tham chiếu cuối cùng của nó bị loại bỏ. – Algorias

+2

Algorias: đó là sự thật cho CPython, nhưng có thể không cho các triển khai khác. – mhsmith

+1

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

4

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

  1. Bạn muốn sử dụng tên old_list hơn nữa 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 đi về với assigment:

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

Trong trường hợp 2 báo cáo kết quả del sẽ làm giảm số lượng tài liệu tham khảo danh sách các đối tượng tên old list điểm tại. Nếu đối tượng danh sách chỉ được chỉ bằng tên old_list tại, số tham chiếu sẽ là 0 và đối tượng sẽ được giải phóng để thu thập rác.

del old_list 
30

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

Ví dụ:

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

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

del list 

sẽ xóa các biến bản thân từ bộ nhớ

1

Nếu bạn xóa danh sách , rõ ràng là bạn không cần danh sách nữa. Nếu có, bạn chỉ có thể xóa toàn bộ danh sách theo phương thức 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ể khởi tạo 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[:] 
-1

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

empt_list = [] 

ví dụ: bạn có danh sách là a_list = [1,2,3]. Để xóa video đó chỉ cần thực hiện như sau:

a_list = list(empt_list) 

này sẽ làm cho a_list một danh sách trống giống như empt_list.

2

Để xóa một danh sách tại chỗ bằng Python 3.3+ bạn cũng có thể sử dụng list.clear(), đó là phù hợp với giao diện của container có thể thay đổi khác (chẳng hạn như dict, set hoặc deque).

old_list.clear() # removes all items from old_list (same as del old_list[:]) 
Các vấn đề liên quan