Sen*_*n B 3 python memory-management
今天我遇到一个有趣的案例
a = 10
b = 10
print (a is b)
Run Code Online (Sandbox Code Playgroud)
登出True。我做了一些搜索并发现了实习的概念。现在这解释了为什么True范围 [-5, 256] 是正确的。然而,即使使用浮动我也得到相同的结果。请帮助我理解为什么。
这是我不明白的部分-
a = 1000.00
b = 999.99 + 0.01
print (a is b)
# Output was 'True'
Run Code Online (Sandbox Code Playgroud)
我期望输出是False因为a的值是在运行程序之前分配的,而b的值是在运行时作为表达式求值的结果确定的,因此应该具有不同的内存地址。
如果您能指出一个情况,其中a==bis True,但a is b计算结果False为 和a都是b类型,我也将不胜感激float
您在您的情况下看到的称为“恒定折叠”。这是一个实现细节,而不是语言规范 - 这意味着不能保证此行为将保持不变,并且您不应在代码中依赖它。但是,总的来说,这归结为这样一个事实:可以“静态”计算的东西在代码实际运行之前被优化到最简单的形式。
看一下以下代码片段的输出
import dis
def f():
return 0.1 + 0.9
def g():
a = 0.1
b = 0.9
return a+b
dis.dis(f)
dis.dis(g)
Run Code Online (Sandbox Code Playgroud)
您会注意到,f尽管查看代码添加显然在那里,但 中 没有执行任何添加。
至于具有不同内存地址的两个相同值的变量,这并不是很困难 - 任何无法在运行前优化的计算都会在不同内存地址处生成变量(如果它们不在实习范围内)。
a = 1
b = 1
for _ in range(1000):
a += 1
b += 1
print(f"{id(a) = }")
print(f"{id(b) = }")
print(f"{a == b = }")
print(f"{a is b = }")
Run Code Online (Sandbox Code Playgroud)