2016-02-27 13 views
0

加入誰能解釋以下:行爲的排序列表中的平等

fruits = ["banana", "orange", "grape"] 
slice = fruits 
print fruits==(slice.sort()) 
print fruits==slice 

輸出:

False 
True 

爲什麼是第一個False

+2

以何種方式被它令人費解嗎?請記住就地排序返回「無」,因此第一次相等比較將是錯誤的。 –

+0

user3309719我採取了一些自由權重新解釋你的問題,使它更適合SO。 –

回答

1

sort()整理列表到位並返回None。在第一個比較中,fruits不是None,所以返回False。在第二次比較中,因爲fruitsslice指向相同的對象,所以必須返回True

0

雖然@Mureinik曾表示就地排序函數返回None,一切都很好,真正的問題是:爲什麼是fruits == slice真當fruits應該是未排序和slice是唯一一個排序?

這可能是大量的信息,但我承擔......

slice = fruits不會產生一個新的列表創建,只有一個新的參考

您排序slicefruits不該後不等於slice,但事實證明它確實如此。這是爲什麼?這是因爲slicefruit指的是同一個對象。當您將slice分配到fruit時,您只能與其建立連接,而其中一個發生的任何事情都會發生在它們兩個之上。

在Python中,您可以檢查變量是否與is運算符引用同一對象。請注意,這是==剛剛檢查內容是否相同,而不是存儲位置不同:

>>> fruits = ["banana", "orange", "grape"] 
>>> slice = fruits 
>>> fruits is slice 
True 
>>> fruits == slice 
False 

把它看成是這樣。無論您使用哪種操作系統,都可以創建文件的桌面快捷方式。但它只是鏈接到真正的文件。但是就像你如何複製和粘貼東西來創建獨立於原始文件的單獨文件一樣,你也可以在Python中這樣做。我知道有兩種方法可以這樣做。

  1. 使用list(...)

    >>> fruits = ["banana", "orange", "grape"] 
    >>> slice = list(fruits) # constructs a new list and copies content 
    >>> fruits is slice 
    False 
    >>> slice is fruits 
    False 
    >>> fruits == slice 
    True 
    
  2. 使用copy.copy(...)

    >>> from copy import copy 
    >>> fruits = ["banana", "orange", "grape"] 
    >>> slice = copy(fruits) # copies to new list 
    >>> fruits is slice 
    False 
    >>> slice is fruits 
    False 
    >>> fruits == slice 
    True 
    

就地操作修改正在傳遞的對象,不返回任何東西(None

返回到問題:使用list.sort()完成的就地排序意味着沒有創建新對象,並且您修改了原始對象。這就是爲什麼該函數不返回任何內容 - 它不需要,因爲它改變了原來的內容。它只是返回None,正如@Mureinik所述,fruits在任何時候都不是None

一個快速演示:

>>> fruits = ['banana', 'orange', 'grape'] 
>>> fruits = fruits.sort() 
>>> fruits # not going to print anything 
>>> fruits is None 
True 
>>> fruits == None 
True 

現在,當你通過修改slice的內容做了一個就地排序,還修改了fruits的內容,因爲他們所指的對象同一個。只有一個對象被創建和操作。

您可以創建sorted()

一個新的排序列表是的,你可以通過創建一個新的列表排序列表。

>>> fruits = ["banana", "orange", "grape"] 
>>> slice = fruits 
>>> slice # still referring to same object 
["banana", "orange", "grape"] 
>>> slice = sorted(slice) # creates a new list, and sorts it 
>>> slice # it's not None because the above returns a new object 
["banana", "grape", "orange"] 
>>> fruits # not modified at all 
["banana", "orange", "grape"] 
>>> fruits == slice 
False 
>>> fruits.sort() 
>>> fruits 
["banana", "grape", "orange"] 
>>> fruits is slice 
False 
>>> fruits == slice 
True 

或者,你也可以先建立一個新的列表,然後執行就地排序:

>>> fruits = ['banana', 'orange', 'grape'] 
>>> slice = list(fruits) # don't refer to same object 
>>> slice.sort() 
>>> slice 
["banana", "grape", "orange"] 
>>> fruits 
['banana', 'orange', 'grape']