2010-06-10 32 views
7

Giả sử bạn có một cái gì đó như:Làm thế nào để xóa mọi tham chiếu của một đối tượng bằng Python?

x = "something" 
b = x 
l = [b] 

Làm thế nào bạn có thể xóa các đối tượng chỉ có một tài liệu tham khảo, nói x?

del x sẽ không thực hiện thủ thuật; đối tượng vẫn có thể truy cập từ b, ví dụ.

+3

nơi này là 'a' bạn đang nói về? –

+0

Ý của bạn là 'x'? –

+3

tại sao bạn muốn thực hiện việc này? – SilentGhost

Trả lời

5

Bạn không. Đó là toàn bộ vấn đề. Hãy tưởng tượng nếu l nằm trong thư viện ngoài tầm kiểm soát của bạn. Nó có mọi quyền mong đợi rằng các yếu tố thu thập không biến mất.

Ngoài ra, hãy tưởng tượng nếu nó là khác. Bạn có câu hỏi ở đây trên SO "Làm cách nào để ngăn người khác xóa đối tượng của tôi?". Là một nhà thiết kế ngôn ngữ, bạn không thể đáp ứng cả hai yêu cầu.

+0

Tôi sẽ không biến mất tất cả danh sách, chỉ một phần tử. –

+0

Chi tiết, không quan trọng. Thư viện giữ một tham chiếu đến đối tượng; theo các quy tắc ngôn ngữ Python, nó có thể dựa vào tham chiếu đó để giữ cho đối tượng còn sống. – MSalters

11

Không không không. Python có một bộ thu gom rác có các vấn đề lãnh thổ rất mạnh - nó sẽ không gây rối với bạn khi tạo các đối tượng, bạn không gây rối với nó khi xóa các đối tượng.

Nói một cách đơn giản, không thể thực hiện được và vì lý do chính đáng. Ví dụ:

Nếu bạn cần các thuật toán lưu giữ các tham chiếu, nhưng không được ngăn dữ liệu thu thập rác khi không có ai đang sử dụng, bạn có thể xem weakref.

+0

porpuse là để esure rằng các đối tượng sẽ không được sử dụng một lần nữa. –

+1

@Juanjo sau đó thực hiện việc này theo cách có lập trình phù hợp. Đối tượng của bạn nên cho phép bạn 'đóng' chủ thể, hoặc bất cứ điều gì bạn đang cố gắng làm. Không có phép thuật nào liên quan. Cũng giống như một tệp phải được đóng lại một lần, bất kể có bao nhiêu hàm đã đọc/ghi vào nó – abyx

+1

@Juanjo: Việc xóa một phần tử không đảm bảo nó không được sử dụng lại. Trong thực tế, nếu nó được sử dụng một lần nữa, chương trình của bạn sẽ sụp đổ. Viết mã của bạn một cách khôn ngoan và không sử dụng các đối tượng bạn không muốn sử dụng. –

7

Giải pháp duy nhất tôi nhìn thấy ngay bây giờ là bạn nên chắc chắn rằng bạn đang nắm giữ các tài liệu tham khảo chỉ để x, tất cả mọi người khác phải không được x bản thân nhưng một tham chiếu yếu chỉ vào x. tài liệu tham khảo yếu được thực hiện trong các module weakref và bạn có thể sử dụng nó theo cách này:

>>> import weakref 
>>> class TestClass(object): 
...  def bark(self): 
...   print "woof!" 
...  def __del__(self): 
...   print "destructor called" 
... 
>>> x = TestClass() 
>>> b = weakref.proxy(x) 
>>> b 
<weakproxy at 0x7fa44dbddd08; to TestClass at 0x7fa44f9093d0> 
>>> b.bark() 
woof! 
>>> del x 
destructor called 
>>> b.bark() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ReferenceError: weakly-referenced object no longer exists 

Tuy nhiên, lưu ý rằng không phải tất cả các lớp học có thể yếu được tham chiếu. Đặc biệt, hầu hết các loại built-in không thể. Một số kiểu tích hợp có thể được tham chiếu yếu nếu bạn phân lớp chúng (như dict), nhưng một số khác không thể (như int).

+0

Còn str thì sao? –

+1

'str' không thể tham chiếu yếu, ngay cả khi bạn phân lớp nó. Các chuỗi tham chiếu yếu sẽ mở ra một lượng lớn các giun; ví dụ, trình thông dịch Python có thể chọn "thực tập" một đối tượng chuỗi và giữ nó trong bộ nhớ ngay cả khi không có tham chiếu đến nó với hy vọng rằng nó có thể hữu ích sau này.Thông thường, trình thông dịch làm như vậy với các chuỗi và số nguyên nhỏ, nhưng bạn cũng có thể chọn thực hiện một chuỗi với nội trang 'intern' (ít nhất là trong Python 2.x). –

Các vấn đề liên quan