x=5 的声明有几件事:
- 一个值为
5的int对象被创建(或者如果它已经存在则找到它);
- 名称
x 已创建(或与最后一个标记为“x”的对象解除关联);
- 对新的(或找到的)int 对象的引用计数增加 1;
- 名称
x 与创建(或找到)值为“5”的对象相关联。
由于 int 对象是不可变的,为了提高效率,它们可能是interned。字符串对象更有可能被实习。
这里有一些例子:
>>> x=5 # discussed
>>> id(x) # the 'id' which in cPython is the memory address.
140246146681256
>>> y=x # now two names, 'x' and 'y' associated with that object
>>> id(y)
140246146681256 # same object
>>> z=5 # no guaranteed, likely the same object referred to by 'x' and 'y'
>>> id(z)
140246146681256 # id is the same! The object labeled 'x' was found and labeled 'z'
>>> del x # ref count to object '140246146681256' decreased by 1
>>> del y # same
>>> z
5
>>> id(z)
140246146681256 # same object but the names ''x' and 'y' no longer label it
将变量名称(如x=5 中的“x”)视为标签的最佳方式。
可能有没有标签的对象,例如在这个列表理解中创建的 5 个单独的字符串对象:
>>> li=[str(x) for x in range(5)]
>>> li
['0', '1', '2', '3', '4']
然后您可以创建与这 5 个对象的值独立匹配的对象:
>>> li2=list('012345') # longer list; completely different construction
>>> li2
['0', '1', '2', '3', '4', '5']
您可以获取它们各自的内存地址(在 cPython 中)或唯一的 id 地址:
>>> [id(x) for x in li]
[4373138488, 4372558792, 4372696960, 4373139288, 4373139368]
>>> [id(x) for x in li2]
[4373138488, 4372558792, 4372696960, 4373139288, 4373139368, 4372696720]
请注意,两个独立创建的匿名对象列表是相同的(在本例中为前 5 个)。我故意使用字符串,因为它们更有可能被埋葬......
所以这样想:x=5 发生了两个不同的过程:
- 对象被创建(或者如果它是不可变的、被实习的并且存在的)并且被找到
- 对象被标记。