我正在学习Core并做一个练习:
4-9。鉴于下列任务: A= 10 B= 10 C= 100 D= 100 E= 10.0 F= 10.0以下每一项的输出是什么?为什么? A是b C是d E为f
当我用崇高的文本2,按下cmd +B来构建它时,我得到了所有的真理。
a = 10
b = 10
c = 100
d = 100
e = 10.0
f = 10.0
print a is b
print c is d
print e is f
Output:
True
True
True
[Finished in 0.0s]
但当我在终点站做这件事时,我得到:
Output:
True
True
False # It's what I expect
为什么结果是不同的?
发布于 2014-10-12 02:08:17
我将假设您已经知道为什么重用a
、b
、c
和d
中的整数值(它们是interned like all small integers)。
Python编译器将不变的文字(如浮点数)存储为字节码的常量。如果在一行中多次使用相同的文字,则重复使用相同的常量。这意味着e
和f
都分配了相同的字节码常量;对两者都使用相同的float
对象,而e is f
是True:
>>> import dis
>>> assignment = compile('''\
... e = 10.0
... f = 10.0
... ''', '<stdin>', 'exec')
>>> dis.dis(assignment)
1 0 LOAD_CONST 0 (10.0)
3 STORE_NAME 0 (e)
2 6 LOAD_CONST 0 (10.0)
9 STORE_NAME 1 (f)
12 LOAD_CONST 1 (None)
15 RETURN_VALUE
>>> assignment.co_consts
(10.0, None)
注意两个LOAD_CONST
指令如何使用相同的索引(0
)加载浮点对象;常数结构只包含一个float
对象。
但是,Python交互式会话分别编译每个语句;字节码编译器没有机会重用常量,而是存储两个不同的对象。编译f = 10.0
时,e = 10.0
已经编译并执行了,该分配的代码对象已经消失。
这就是为什么您看到了在一次运行脚本(就像崇高文本构建命令所做的那样)和将代码粘贴到Python交互式会话之间的区别。
https://stackoverflow.com/questions/26321093
复制相似问题