如果我们有一个列表s
,调用list(s)
与s[:]
之间有什么区别吗?在我看来,他们都创建了具有s
的确切元素的新列表对象。
答案 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.)