2014-10-26 26 views
1

我練了中期,我碰到這個傳來:Python列表和平等

the_cake = [1,2,[3],4,5] 
a_lie = the_cake[1:4] 
the_cake = the_cake[1:4] 
great = a_lie 
delicious = the_cake 
moist = great[:-1] 

在Python解釋器運行此代碼後,爲什麼:

the_cake.append == a_lie.append 
False 

我的想法是他們是平等的方法,雖然不是「是」,但應該實現平等。

也許這個評估爲False,因爲實例化? 如果這是真的,那麼在比較時類屬性評估爲真? 這是一個列表對象的特例嗎?


後續: 根據這個: Is there a difference between `==` and `is` in Python?

「是,如果兩個變量指向同一個對象,==如果由變量引用的對象相等將返回True」

然後,List類的方法指向分離​​「append」方法的實例嗎?

所以如果我定義一個函數x(參數),每次我調用它,它會是相同的,因爲它是分配給不同變量的同一個對象,對吧?

那麼對於一些等價的變量 「參數」:

x(parameter) == x(parameter) 
True 

謝謝!

+0

我敢打賭,這是因爲它們所連接的不同對象(以及它們的不同位置) – IanAuld 2014-10-27 00:07:25

+0

Python比較函數內存地址。 [如何比較函數?](http://stackoverflow.com/questions/7942346/how-does-python-compare-functions) – 2014-10-27 00:09:27

+0

@DaveL我很高興我可以有任何幫助。自從你接受它以後,你能否提高我的答案?謝謝。 – kolonel 2014-10-27 00:46:41

回答

2

這些方法以及它們各自的對象實例位於不同的位置。舉例來說,我們有:

a = [] 
b = [] 

因此,我們有:

>>> a.append == b.append 
False 

和他們各自的位置是在給定的:

>>> a.append 
<built-in method append of list object at 0x7f7c7c97d560> 
>>> b.append 
<built-in method append of list object at 0x7f7c7c97d908> 

公告不同的地址。

1

Python 2.x:基於內存中對象的地址,type objects的函數實現rich comparisons

Python 3.x:小心功能不再可訂購。所以,例如,the_cake.append > a_lie.append會拋出一條錯誤消息。

1

這兩個答案都是有效的,但檢查了這一點太:

>>> a = [] 
>>> b = a 
>>> a.append == b.append 
True 
+0

是的,但在這種情況下,'a'和'b'指向相同地址的同一個對象。 – kolonel 2014-10-27 00:17:41

+0

不要太震驚考慮一個是b – 2014-10-27 00:17:47

+0

...這就是要點。 – nathancahill 2014-10-27 01:05:38

1

在Python列表的切片總是返回一個新的列表。 the_cake[1:4]也會返回一個新列表。所以如果你每次調用同一個slice,並不意味着它會返回相同的列表。無論你是否一次又一次地執行同一個切片,每當它被調用時它都會返回一個新列表。

即使您將同一片the_cake[1:4]分配給a_lie以及其本身(即,the_cake),都指的是一個不同於另一個的新列表。 因此,這兩個列表在創建過程中都分配了不同的內存位置。如果您檢查id(the_cake) == id(a_lie),它將返回False

所以現在當你引用兩個實例的append時,它們也是不同的。即使同樣的方法被引用,它也是從兩個不同的實例中引用的。所以它會爲被調用的方法創建不同的實例。因此,在調用the_cake.append時引用的實例不同於a_lie.append。