list()和[:]之间的区别

时间:2014-11-07 01:03:54

标签: python list syntax

如果我们有一个列表s,调用list(s)s[:]之间有什么区别吗?在我看来,他们都创建了具有s的确切元素的新列表对象。

4 个答案:

答案 0 :(得分: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[:]是&#34的常用习语;给我一个这个序列的浅层副本,我真的不关心它是什么样的序列......",但它不会对任意迭代进行处理。

答案 1 :(得分:1)

list()更好 - 它更具可读性。除此之外没有区别。

答案 2 :(得分: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']

答案 3 :(得分:0)

我没有意识到,但正如ventsyv所提到的,s[:]list(s)都创建了s的副本。 请注意,您可以使用is检查对象是否相同,并且可以使用id()来获取对象的内存地址,以实际查看它们是否相同。

>>> 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(object) - &gt;整数

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