【发布时间】:2015-11-17 11:09:00
【问题描述】:
在 Python 中内存分配是如何发生的?
>>> a=1
>>> b=1
>>> id(a)
2011353552
>>> id(b)
2011353552
>>> b+=1
>>> id(b)
这里,id(a) 等于 id(b)。当我增加 b id(b) 的值时。有人可以对此有所了解吗?
【问题讨论】:
标签: python-3.x dynamic-memory-allocation
在 Python 中内存分配是如何发生的?
>>> a=1
>>> b=1
>>> id(a)
2011353552
>>> id(b)
2011353552
>>> b+=1
>>> id(b)
这里,id(a) 等于 id(b)。当我增加 b id(b) 的值时。有人可以对此有所了解吗?
【问题讨论】:
标签: python-3.x dynamic-memory-allocation
这是因为在 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
【讨论】:
这个问题有一些误解,所以我只是给你一些事实,希望对你有所帮助:
由于数字对象是不可变的,它们可能指向同一个内存。具体来说,来自源的1 可以(但不必)始终是同一个对象。
您并没有真正增加b 的值以保证技术上正确。您创建一个表示2 的新对象(或获取现有对象)并将其分配给b 变量。它现在是一个新对象。
id() 用于对象的唯一标识符。它根本不必与内存分配有关。目前确实如此,因为cPython 以这种方式使用它。但正如文档所述:
返回对象的“身份”。这是一个整数(或长整数),保证此对象在其生命周期内是唯一且恒定的。
仅此而已-仅此而已。这里有多项优化,所以我不希望id() 有任何合理的行为。
【讨论】: