我有一个简单的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规则是什么,我一直都知道赋值不会引起实例化,但是看起来这确实是这里发生的事情?如何运作?
references] >>。当您创建将point1.x作为x值传递的point2时,您将获得对相同值的新引用。这就是为什么它具有相同的ID。在这种情况下,实际上并不重要,因为整数是不可变的。如果x是一个可变对象(如列表),可能会很重要。尝试一下,看看通过任何一个对象的x引用更改列表时会发生什么(您会看到通过一个变量进行的更改会影响另一个变量)。
在理解整数情况下的这种行为时,还有一点点复杂,因为CPython会“实习”小整数。也就是说,对整数1的每个引用最终都是对1的相同副本的引用。尝试重复您的实验,但直接输入1而不是point1.x,您将明白我的意思。