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



我有一个简单的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 变量 - 这包括对象的成员以及列表和字典元素等内容 - 是对值的引用。当您创建将 point1.x 作为 x 值传递的 point2 时,您将获得对相同值的新引用。这就是为什么它具有相同的 id。

在这种情况下,这真的无关紧要,因为整数是不可变的。如果您的 x 是像列表这样的可变对象,这可能很重要。试试这个,看看当你通过任何一个对象的 x 引用更改列表时会发生什么(你会看到通过一个变量所做的更改会影响另一个变量(。

在整数的情况下,理解这种行为还有另一个小复杂之处,因为CPython"实习"小整数。也就是说,对整数 1 的每个引用最终都是对 1 的同一副本的引用。尝试重复你的实验,但从字面上传入 1 而不是 point1.x,你就会明白我的意思。

最新更新