[英]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.