2015-07-21 59 views
3

我希望打印的值是「200!」和「404!」在Python3.4中。但是我得到了結果「200!」和「別的!」。爲什麼Python 3和C中的if語句的結果不同?

我做了一個奇怪的臉 - 並在C中再次嘗試。C中的結果與Python3中的結果不一樣。爲什麼?

Python3.4代碼

def chk(s): 
    if s is 200: 
     print('200!') 
    elif s is 404: 
     print('404!') 
    else: 
     print('else!') 

chk(200) 
chk(404) 

Python3.4碼結果

200! 
else! 

C代碼

#include <stdio.h> 

void chk(int s) { 
    if (s == 200) 
     printf("200!"); 
    else if (s == 404) 
     printf("404!"); 
    else 
     printf("else!"); 
} 

int main(void) { 
    chk(200); 
    chk(404); 
    return 0; 
} 

C代碼結果

200!404! 

回答

7

is本身並不意味着「相等」。它實際上意味着「在內存中佔據相同的位置」。另外,在數字上使用is有奇怪的行爲,這取決於你使用的是哪個版本的Python。 (通過這個,我的意思是Cpython vs Jpython vs pypy vs ....)所以不要使用它,請使用==作爲數字。

def chk(s): 
    if s == 200: 
     print('200!') 
    elif s == 404: 
     print('404!') 
    else: 
     print('else!') 

chk(200) 
chk(404) 

(如果您想了解更多的細節,爲什麼200 is 200產生True404 is 404產量False:基本上,從-5256號碼被緩存在CPython的他們每個人都得到他們的內存插槽少,如果他們分配。對於一個變量,CPython只是將一些變量指向預先指定的內存區域,對於那些範圍以外的數字,情況並非如此,如果需要的話,CPython將會找到一個空的內存區域,指向它的變量如果將404分配給兩個單獨的變量,則會有兩個單獨的整數404掛在內存中。)

更多:

When to use is, when to use ==.

CPython, is, and why you should never use it with numbers

+0

謝謝。我不使用'is'。 – user10501

+0

@ user10501:實際上,當測試一個名稱是「None」時,你應該明確地使用它。 '== None'肯定是錯誤的方法。 – Olaf

+0

我還想指出'is'對於某些事情是有用的。只是,呃,不是數字。 – NightShadeQueen

1

is基本上比較了對象的身份。請注意,Python names只是對實際對象的引用。這樣,C相當於將基本上是:

int k = 200, *i; 
const int c = 200; 

i = &k; 

if (i == &c) 
    // fails, but *i == c is true 
    .... 

所以,你不應該使用is平等比較值,但對於身份只。最重要的用例是:

if val is None: 
    ... 

由於恰好有一個None對象。

if val == None: 
    ... 

OTOH將受制於強制規則,因此對於其他各種情況也是如此。

閱讀here(搜索關於is的段落)和腳註的細節。

+0

它是明碼。謝謝。 – user10501

相關問題