【发布时间】:2020-10-29 04:50:39
【问题描述】:
考虑以下代码:
x = 50000000
y = 50000000
print(hex(id(x)), hex(id(y)))
print(x is y)
这给出了:
0x23ef28ec930 0x23ef28ec930
True
现在我被引导相信对于小的值,python 使用优化来将它们缓存在内存中。 但这个数字明显大于这个值,我认为是 256。
为什么当我声明这些时它们不是单独存储在内存中的?
如果我在打印语句之前添加y+=1 行,那么x and y 将存储在内存中的不同位置,x is y 是False。我原以为它们都是内存中的同一个对象,增加y 也会增加x。
很明显,我遗漏了一些基本的东西,希望能得到澄清。
还有一点,这种行为是否取决于变量类型?如果x,y 不是整数而是列表、字符串或任何其他对象怎么办?
谢谢!
【问题讨论】:
-
它给了我不同的结果。
0x7f907030acf0 0x7f907030a8b0;False你一定做错了什么。 -
@Pygirl 您是否完全按照说明复制了该示例?在 Windows 上以 Python 3.7.7 运行产生与问题相同的结果。
-
@Pygirl:这种行为可能无法以某种方式得到保证。
-
我在 ubuntu 中试过。 python 3.7.3
-
我认为这主要是由于 cpython 处理内存寻址的方式。在给出的示例中,两个变量都指向同一个地址,因此
is在比较内存地址时返回True。递增会更改y指向的值,因此会分配新的内存地址。但是,我不知道在哪些情况下 cpython 解释器会倾向于将不同的内存寻址分配给存储相等值的变量,例如在 @Pygirl 的情况下。
标签: python python-3.x memory memory-management