在接触了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是一样的。变量名只是对象本身的绑定。