0

我學習Python核心和做練習:當我運行python代碼時,在Sublime Text和terminal中獲取不同的結果?

4-9。給出下面的分配:

A = 10
B = 10
C = 100
d = 100
E = 10.0
F = 10.0

什麼是每個的輸出以下爲什麼?

A是B
c是D-
ê爲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

請注意,ST所做的只是告訴Python將該文件作爲常規腳本運行。 – 2014-10-12 02:57:28

回答

1

我會假設你已經知道爲什麼在abcd整數值被重新使用(他們是interned like all small integers)。

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已經被編譯和執行,並且該分配的代碼對象已經不存在了。

這就是爲什麼你看到一氣呵成運行腳本之間的差異(如崇高文字Build命令一樣)和代碼粘貼到Python交互式會話。

相關問題