python 中的内存分配
memory allocation in python
Python 中的内存分配是如何发生的?
>>> a=1
>>> b=1
>>> id(a)
2011353552
>>> id(b)
2011353552
>>> b+=1
>>> id(b)
这里,id(a) 等于 id(b)。当我增加 b id(b) 的值时会发生变化。任何人都可以对此有所了解吗?
问题中存在一些误解,所以我只提供一些事实,希望对您有所帮助:
由于数字对象是不可变的,它们可能指向相同的内存。具体来说,来自源的 1
可以(但不一定)始终是同一个对象。
您并没有真正增加 b
的值以在技术上是正确的。您创建一个表示 2
的新对象(或获取现有对象)并将其分配给 b
变量。现在是新对象了。
id()
用于对象的唯一标识符。它根本不必与内存分配相关。目前它确实如此,因为 cPython
以这种方式使用它。但正如文档所述:
Return the “identity” of an object. This is an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime.
仅此而已 - 仅此而已。这里有多项优化,所以我不希望 id()
有任何合理的行为。
这是因为在 python 中一切都是对象,小整数从 -5
到 256
都是单例并且被缓存,这就是为什么 id(a) == id(b)
现在当你这样做的时候b += 1
您将 b
重新分配给 b + 1
,这不是递增。如您所见,a
和 b
在第一种情况下指向同一个对象,但随后您重新分配 b
它指向不同的对象。
>>> a = 1
>>> b = 1
>>> a is b
True
>>> b += 1
>>> a is b
False
Python 中的内存分配是如何发生的?
>>> a=1
>>> b=1
>>> id(a)
2011353552
>>> id(b)
2011353552
>>> b+=1
>>> id(b)
这里,id(a) 等于 id(b)。当我增加 b id(b) 的值时会发生变化。任何人都可以对此有所了解吗?
问题中存在一些误解,所以我只提供一些事实,希望对您有所帮助:
由于数字对象是不可变的,它们可能指向相同的内存。具体来说,来自源的
1
可以(但不一定)始终是同一个对象。您并没有真正增加
b
的值以在技术上是正确的。您创建一个表示2
的新对象(或获取现有对象)并将其分配给b
变量。现在是新对象了。id()
用于对象的唯一标识符。它根本不必与内存分配相关。目前它确实如此,因为cPython
以这种方式使用它。但正如文档所述:
Return the “identity” of an object. This is an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime.
仅此而已 - 仅此而已。这里有多项优化,所以我不希望 id()
有任何合理的行为。
这是因为在 python 中一切都是对象,小整数从 -5
到 256
都是单例并且被缓存,这就是为什么 id(a) == id(b)
现在当你这样做的时候b += 1
您将 b
重新分配给 b + 1
,这不是递增。如您所见,a
和 b
在第一种情况下指向同一个对象,但随后您重新分配 b
它指向不同的对象。
>>> a = 1
>>> b = 1
>>> a is b
True
>>> b += 1
>>> a is b
False