我想知道在Python中将iterable转换为列表的这两种方式是否有任何区别:
使用list()构造函数:
my_list = list(my_iterable)
Run Code Online (Sandbox Code Playgroud)使用完整切片:
my_list = my_iterable[:]
Run Code Online (Sandbox Code Playgroud)实施方面是否存在差异?如果是这样,性能怎么样?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)
但你应该避免这样的定义.
| 归档时间: |
|
| 查看次数: |
1282 次 |
| 最近记录: |