2017-03-02 107 views
3

在交互式python shell中試試這個。爲什麼在[python]中將[] []評估爲False

[] is [ ] 

以上返回False,爲什麼?

+6

也許你應該解釋爲什麼你認爲它應該是真的嗎? –

+6

'[]是[]'也會失敗:這兩個是**不同的對象**。 '是'進行**參考相等檢查**。 –

+1

爲什麼這應該是真的?你創建了兩個空的可變對象,你不希望它們是同一個對象。 –

回答

11

您創建了兩個可變對象,然後用is,看看那些是同一個對象。那肯定會回到False,否則會被打破。

你不會想要is在這裏返回true。試想一下,如果你這樣做:

foo = [] 
bar = [] 
foo.append(42) 

,那麼你會很驚訝,如果bar現在包含42。如果is返回true,意味着兩個[]調用返回完全相同的對象,則在bar的引用中可以看到追加到foo

對於不變對象,是有意義的緩存對象,在這一點is可以返回true,就像空的元組:

>>>() is() # are these two things the same object? 
True 

CPython的實施,優化空的元組的創建;您將始終獲得完全相同的對象,因爲這可以節省內存並使某些操作更快。因爲元組是不可變的,所以這是完全安全的。

如果您希望測試值相等而不是,那麼您得到了錯誤的運算符。使用==操盤手:

>>> [] == [] # do these two objects have the same value? 
True 
0

[]就像list(),如果你這樣做:

a = list() 
b = list() 

明確ab是兩個完全地不同的對象,因此:

a is b # False 

list() is list() # False 

[] is [] # False 
+1

爲什麼空列表對象的創建方式很重要? –

+0

@MartijnPieters,沒關係,也許我沒有解釋清楚,或者你不明白我想解釋什麼? – Netwave

+0

我的意思是,如果你使用'[] is []'或者list()是list()',那麼它並不重要。這兩個表達式都會創建空列表對象要說*'[]'就像'list()'*,你沒有解釋爲什麼'is'測試返回'False',因爲'[]'和'list()'之間的區別不是這裏很重要。另外,你的'== False'測試不正確;你正在測試'(a是b)和(b == False)',因爲Python比較操作符是*鏈接的*。 –

1

在蟒蛇is做了reference equality check像[]和[]他們是可以檢查不同的對象,通過

print id([]),id([]) 


In [1]: id([]) 
Out[1]: 140464629086976 

In [2]: id([]) 
Out[2]: 140464628521656 

兩者都會返回不同的地址,兩者都是不同的對象所以總是會給出錯誤

[] is [] 

輸出

false 
+3

那些'id'測試沒有做你認爲他們是。 'print'打印兩次相同的數字是很常見的,因爲這些列表的壽命不會重疊。同樣,這就是爲什麼用'id'值測試'=='測試會給出True而不是False。 – user2357112

相關問題