Python中的对象创建——修改后的变量发生了什么



在接触了Python的更深入的工作之后,我开始理解给一个变量赋值等于创建一个新的对象,这个对象有自己的特定地址,而不管给这个对象赋的变量名是什么。

在这种情况下,它使我想知道稍后创建和修改的对象会发生什么。它会坐在那里消耗内存吗?

想象中的场景是这样的:

# Creates object with id 10101001 (random numbers)
x = 5
# Creates object with id 10010010 using the value from object 10101001.
x += 10

id为10101001的对象发生了什么?出于好奇,为什么对象需要一个ID和一个引用,这是变量名,不是更好的只是分配地址与变量名?

我为这个问题可能会引起别人的不满提前道歉。

这是Ned Batchelder今年在PyCon上做的一个关于Python如何管理变量的演讲。

https://www.youtube.com/watch?v=_AEJHKGk9ns

我想这会有助于消除你的一些困惑。

首先,增广赋值语句声明:

x += 1这样的增广赋值表达式可以重写为x = x + 1,以达到类似但不完全相同的效果。在增广版本中,x只计算一次。而且,在可能的情况下,实际操作是就地执行的,这意味着不是创建新对象并将其分配给目标,而是修改旧对象。

因此,根据x的类型,这可能不会创建新对象。

Python是引用计数的。因此,id为10101001的对象的引用计数递减。如果该计数为零,则几乎立即释放。但无论如何,大多数低范围整数都会被缓存。请参考对象、类型和引用计数了解所有细节。

关于对象的id:

CPython实现细节:这是对象在内存中的地址。

基本上id和reference是一样的。变量名只是对象本身的绑定。

最新更新