我有一个简单的Point
类,属性z
、y
和z
。我首先实例化第一个对象:
point1 = Point(1, 2, 3)
现在我像这样实例化我的第二点:
point2 = Point(point1.x, 3, 4)
当我在点和属性上运行id()
时,我得到这个
id(point1): 1565146411848: x: 1, y: 2, z: 3 id(point1.x): 140711867415616
id(point2): 1565146435400: x: 1, y: 3, z: 4 id(point2.x): 140711867415616
显然,这两个 Point 对象是唯一的,但是,它们似乎共享相同的x
.
现在,当我更改时,比如说point2.x = 900
,会发生以下情况:
id(point1): 1565146411848: x: 1, y: 2, z: 3 id(point1.x): 140711867415616
id(point2): 1565146435400: x: 900, y: 3, z: 4 id(point2.x): 1565143647248
point2.x
现在与point1.x
不同。 所以我假设在这些条件下的分配点,创建了属性x
的新实例? 我不清楚 python 的规则是什么,我一直明白赋值不会导致实例化,但是看起来这正是这里发生的事情? 这是如何工作的?
Python 变量 - 这包括对象的成员以及列表和字典元素等内容 - 是对值的引用。当您创建将 point1.x 作为 x 值传递的 point2 时,您将获得对相同值的新引用。这就是为什么它具有相同的 id。
在这种情况下,这真的无关紧要,因为整数是不可变的。如果您的 x 是像列表这样的可变对象,这可能很重要。试试这个,看看当你通过任何一个对象的 x 引用更改列表时会发生什么(你会看到通过一个变量所做的更改会影响另一个变量(。
在整数的情况下,理解这种行为还有另一个小复杂之处,因为CPython"实习"小整数。也就是说,对整数 1 的每个引用最终都是对 1 的同一副本的引用。尝试重复你的实验,但从字面上传入 1 而不是 point1.x,你就会明白我的意思。