当我运行python代码时,在Sublime Text和终端中获得不同的结果?

时间:2014-10-12 01:55:33

标签: python sublimetext2 read-eval-print-loop python-internals

我正在学习核心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

为什么结果不同?

1 个答案:

答案 0 :(得分:1)

我假设您已经知道为什么abcd中的整数值会被重复使用({{3} }})。

Python字节码编译器将不可变文字(例如浮点数)存储为带字节码的常量。当您连续多次使用相同的文字时,会重复使用相同的常量。这意味着ef都被分配了相同的字节码常量; 同一个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交互式会话之间的区别。