我正在学习核心Python 并进行练习:
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
为什么结果不同?
答案 0 :(得分:1)
我假设您已经知道为什么a
,b
,c
和d
中的整数值会被重复使用({{3} }})。
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
已经编译并执行,并且该任务的代码对象已经消失。
这就是为什么你看到一次运行脚本(如Sublime Text Build命令那样)和将代码粘贴到Python交互式会话之间的区别。