2014-11-07 43 views
0

之間的區別如果我們有一個列表s,調用list(s)s[:]之間是否有區別?在我看來,他們都創建了具有s的確切元素的新列表對象。列表()與[:]

回答

4

在這兩種情況下,他們應該創建一個(淺)副本的列表。

注意,有一個角落的情況下(這幾乎是值得一提的),它可能會在不同的...

list = tuple # Don't ever do this! 
list_copy = list(some_list) # Oops, actually it's a tuple ... 
actually_list_copy = some_list[:] 

隨着中說,沒人神智清醒應該永遠陰影內建list就是這樣。

我的建議,使用無論你覺得更容易閱讀,並在當前的情況下很好地工作。

  • list(...)使得它明確的輸出是一個列表,並會做一個清單出來任何迭代。
  • something[:]是「給我一個這個序列的淺拷貝,我真的不在乎它是什麼樣的序列......」,但它不適用於任意迭代。
+1

不是說它是超級重要的,但'':'''一般優於'list()'。運行一個簡單的'timeit'測試,列表'[1,2,3]'得到'list()'的0.9552267117748205'和[[:]'的'0.4996651809098642'。但就像我說的,這有點挑剔;在大多數情況下,時差可以忽略不計。 – iCodez 2014-11-07 01:17:29

+1

@iCodez - 這是真的,我以前遇到過。理由是'list(...)'需要一個全球性的查詢,這個查詢有點貴。而且全局查找是必需的,因爲用戶隱藏「list」的瘋狂情況。通過切片,方法查找只進行一次(在字節碼生成期間),並簡單地在對象上調用。可能還有其他原因。 。 。該實現可能會優化'list .__ getitem__',因爲它可以很容易地知道輸出中對象的內存位置,但'list'可能會訴諸多次調用'.next()'...... – mgilson 2014-11-07 01:21:10

1

list()更好 - 它更具可讀性。除此之外,沒有區別。

0

我沒有意識到,但正如ventsyv提到的,s[:]list(s)都創建s的副本。 請注意,您可以檢查的目的是使用isid()可以用來獲取對象的內存地址實際上看它們是否相同或不相同。

>>> s = [1,2,3] 
>>> listed_s = list(s) 
>>> id(s) 
44056328 
>>> id(listed_s) # different 
44101840 
>>> listed_s is s 
False 
>>> bracket_s = s[:] 
>>> bracket_s is s 
False 
>>> id(bracket_s) 
44123760 
>>> z = s # points to the same object in memory 
>>> z is s 
True 
>>> id(z) 
44056328 
>>> 

ID(...) ID(對象) - >整數

Return the identity of an object. This is guaranteed to be unique among 
simultaneously existing objects. (Hint: it's the object's memory address.) 
1

簡短的回答是使用list()。在谷歌鍵入python [:]然後鍵入python list

如果s是一個列表,則沒有什麼區別,但總是有一個列表?或者它可能是一個序列或一個發生器?

In [1]: nums = 1, 2, 3 

In [2]: nums 
Out[2]: (1, 2, 3) 

In [3]: nums[:] 
Out[3]: (1, 2, 3) 

In [4]: list(nums) 
Out[4]: [1, 2, 3] 

In [7]: strings = (str(x) for x in nums) 

In [8]: strings 
Out[8]: <generator object <genexpr> at 0x7f77be460550> 

In [9]: strings[:] 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-9-358af12435ff> in <module>() 
----> 1 strings[:] 

TypeError: 'generator' object has no attribute '__getitem__' 

In [10]: list(strings) 
Out[10]: ['1', '2', '3']