Python:将iterable转换为list:'list(x)'与full slice'x [:]'

Byt*_*der 3 python list slice

我想知道在Python中将iterable转换为列表的这两种方式是否有任何区别:

实施方面是否存在差异?如果是这样,性能怎么样?Python 2与Python 3的任何变化?

当然我意识到构造函数版本的可读性要好得多.

Joh*_*nck 10

list(thing) 给你一个清单.

thing[:] 可以给你任何想要的类型.

换句话说,第二个选项仅适用于特定类型(并且您没有提到您实际使用的类型).

编辑:一个有用的特性thing[:]是,当它被支持时,它通常会导致对"事物的所有元素"的引用,可以在不改变哪个对象thing指向的情况下对其进行修改.例如:

thing[:] = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

将分配[1,2,3]到最重要的内容thing,即使这不是列表本身.鉴于:

list(thing) = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

是无稽之谈,并且:

thing = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

使得thing指一个新的列表,而不管其以前的类型.


Ale*_*all 10

并非所有东西都支持切片,例如发电机:

(x for x in range(5))[:]   # raises an error
Run Code Online (Sandbox Code Playgroud)

所以list更一般.[:]是一种主要只是一种复制列表的方法.

[:]可能的主要原因是因为它是你在结束之前省略索引(例如[:3])并在之后省略索引时得到的结果,两者都是有用的.如果添加一个步骤,它也很有用,例如,它[::-1]是反转字符串的常用方法.[:]虽然可读性通常比这种微观优化更重要,但是对于某个列表来说它本身并不是很有用,但是对于某些情况它稍微快一点,因为我对Padriac的答案进行了评论.

对于非列表,[:]理论上可以做任何事情取决于你告诉它的内容:

class A(object):
    def __getitem__(self, item):
        return 3

print A()[:]  # prints 3
Run Code Online (Sandbox Code Playgroud)

但你应该避免这样的定义.