簡體   English   中英

python中的復合布爾邏輯if

[英]Compound boolean logic in python if

我試圖在python中測試一個基本前提,它總是失敗,我無法弄清楚為什么。

我的sys.argv看起來像這樣:

['test.py', 'test']

我的代碼看起來像這樣:

if len(sys.argv) > 1 and sys.argv[1] is 'test':
    print 'Test mode'

但測試從未如此。 我確信我在這里遺漏了一些非常簡單的東西,但我無法弄清楚它是什么。

如上所述,主要原因是您的test比較。 使用is與使用==不同,因為它比較兩個對象是否相等。 在這種情況下,您可以通過檢查其ID來驗證它們不相等:

import sys

print id(sys.argv[1])
print id('test')

我的輸出:

140335994263232
140335994263424

當他們指向不同的對象時,使用is時它們將不相等(但使用==將比較字符串本身,這將返回True )。

這里的問題是實習的概念。 當您將兩個相同的字符串硬編碼到源中時,字符串將被實現,兩者將共享一個對象ID(這解釋了@ SamMussmann在下面非常有效的點)。 但是當你在via argv傳遞一個字符串時,會創建一個新對象,從而使得與代碼中相同的硬編碼字符串的比較返回False 到目前為止,我發現的最好的解釋是在這里 ,Alex Martelli和Jon Skeet(兩個非常有信譽的消息來源)解釋了實習並且當字符串被實習時。 從這些解釋看來,似乎由於來自argv的數據在程序外部,因此值不會被實現,因此具有不同的對象ID,而不是它們都是源中的文字。

感興趣的(無關的問題在手,但相關的一個額外的點is討論)是用數字做緩存。 從-5到256的數字被緩存,這意味着is在該范圍內相等數量的比較將成為真正的,不管它們是如何計算出來的:

In [1]: 256 is 255 + 1
Out[1]: True

In [2]: 257 is 256 + 1
Out[2]: False

In [3]: -5 is -4 - 1
Out[3]: True

In [4]: -6 is -5 - 1
Out[4]: False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM