加入誰能解釋以下:行爲的排序列表中的平等
fruits = ["banana", "orange", "grape"]
slice = fruits
print fruits==(slice.sort())
print fruits==slice
輸出:
False
True
爲什麼是第一個False
?
加入誰能解釋以下:行爲的排序列表中的平等
fruits = ["banana", "orange", "grape"]
slice = fruits
print fruits==(slice.sort())
print fruits==slice
輸出:
False
True
爲什麼是第一個False
?
sort()
整理列表到位並返回None
。在第一個比較中,fruits
不是None
,所以返回False
。在第二次比較中,因爲fruits
和slice
指向相同的對象,所以必須返回True
。
雖然@Mureinik曾表示就地排序函數返回None
,一切都很好,真正的問題是:爲什麼是fruits == slice
真當fruits
應該是未排序和slice
是唯一一個排序?
這可能是大量的信息,但我承擔......
slice = fruits
不會產生一個新的列表創建,只有一個新的參考您排序slice
,fruits
不該後不等於slice
,但事實證明它確實如此。這是爲什麼?這是因爲slice
和fruit
指的是同一個對象。當您將slice
分配到fruit
時,您只能與其建立連接,而其中一個發生的任何事情都會發生在它們兩個之上。
在Python中,您可以檢查變量是否與is
運算符引用同一對象。請注意,這是==
剛剛檢查內容是否相同,而不是存儲位置不同:
>>> fruits = ["banana", "orange", "grape"]
>>> slice = fruits
>>> fruits is slice
True
>>> fruits == slice
False
把它看成是這樣。無論您使用哪種操作系統,都可以創建文件的桌面快捷方式。但它只是鏈接到真正的文件。但是就像你如何複製和粘貼東西來創建獨立於原始文件的單獨文件一樣,你也可以在Python中這樣做。我知道有兩種方法可以這樣做。
使用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
使用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']
以何種方式被它令人費解嗎?請記住就地排序返回「無」,因此第一次相等比較將是錯誤的。 –
user3309719我採取了一些自由權重新解釋你的問題,使它更適合SO。 –