2014-11-07 52 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']