当使用现有类的属性创建新类时,python如何实例化属性?

问题描述 投票:1回答:1

我有一个简单的Point类,具有属性zyz。我首先实例化第一个对象:

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 class attributes instantiation
1个回答
0
投票
Python变量-包括对象的成员以及列表和字典元素之类的东西-对值的[[

references] >>。当您创建将point1.x作为x值传递的point2时,您将获得对相同值的新引用。这就是为什么它具有相同的ID。在这种情况下,实际上并不重要,因为整数是不可变的。如果x是一个可变对象(如列表),可能会很重要。尝试一下,看看通过任何一个对象的x引用更改列表时会发生什么(您会看到通过一个变量进行的更改会影响另一个变量)。

在理解整数情况下的这种行为时,还有一点点复杂,因为CPython会“实习”小整数。也就是说,对整数1的每个引用最终都是对1的相同副本的引用。尝试重复您的实验,但直接输入1而不是point1.x,您将明白我的意思。
© www.soinside.com 2019 - 2024. All rights reserved.