2015-05-08 25 views
5

Tôi biết rằng câu hỏi này đã được yêu cầu ở đây ở dạng one hoặc another, nhưng không có câu trả lời nào giải quyết được hành vi mà tôi thấy. Tôi được đưa ra để hiểu rằng một danh sách các đối tượng chỉ nên giữ tài liệu tham khảo cho các đối tượng đó. Những gì tôi quan sát dường như hợp đồng này:Danh sách các tham chiếu đối tượng trong python

class Foo(object): 
    def __init__(self,val): 
     self.value=val 

a = Foo(2) 
b = [a] 
print b[0].value 

a = Foo(3) 
print b[0].value 

tôi mong đợi để xem 2 in đầu tiên, sau đó 3, vì tôi mong đợi b[0] để trỏ đến a, mà bây giờ là một đối tượng mới. Thay vào đó, tôi thấy 22. Tôi đang thiếu gì ở đây?

Trả lời

2

Trong Python, toán tử gán liên kết kết quả của biểu thức bên tay phải với tên từ biểu thức bên trái.

Vì vậy, khi bạn nói

a = Foo(2) 
b = [a] 

bạn đã tạo ra một đối tượng Foo và tham khảo nó với a. Sau đó, bạn tạo danh sách b với tham chiếu đến đối tượng Foo (a). Đó là lý do tại sao b[0].value in 2.

Nhưng,

a = Foo(3) 

tạo ra một đối tượng mới Foo và đề cập rằng với tên a. Vì vậy, bây giờ a đề cập đến đối tượng Foo mới không phải là đối tượng cũ. Nhưng danh sách vẫn chỉ có tham chiếu đến đối tượng cũ. Đó là lý do tại sao nó vẫn in 2.

3

b[0] trỏ đến đối tượng bạn đã tạo ban đầu với Foo(2). Khi bạn làm a = Foo(3), bạn tạo một đối tượng mới và gọi nó là a. Bạn không thay đổi b bằng bất kỳ cách nào.

Hành vi này là do chính xác những gì bạn đã nói: b giữ tham chiếu đến đối tượng . Nó không giữ tham chiếu đến tên mà bạn đã sử dụng để chỉ đối tượng đó. Vì vậy, đối tượng trong b[0] không biết bất kỳ điều gì về bất kỳ biến nào được gọi là a. Chỉ định giá trị mới cho a không có hiệu lực trên b.

+0

* Trán trán *. Cảm ơn. Tất cả đã bị xóa. – aslanides

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