假设我们有一个Foo
类,我们想要实例化一个列表foos
,我们可以这样做:
foo_list = [Foo()] * 3
Run Code Online (Sandbox Code Playgroud)
现在怎么办foo_list[0].x = 5
?该声明将属性设置x
到所有列表里面的实例!
当我发现它时,它引起了我的注意.问题是当我们创建这样的列表时,显然python将Foo
首先创建实例,然后是列表实例,然后将相同的对象追加到它3次,但我真的希望它能做到这样的事情:
foo_list = [Foo() for i in range(3)]
Run Code Online (Sandbox Code Playgroud)
你也不是吗?嗯,现在我知道这个语法糖绝对不能用,因为我想用它,但那么,它用于什么?我唯一能想到的是创建一个像这样的初始大小的列表:list = [None] * 5
对于我来说,在python的情况下这对我来说没有多大意义.
这个语法有没有其他真正有用的用例?
您可以使用星形形式,使用任何不可变类型,如下所示
print [5] * 3
print "abc" * 3
print [1.1] * 3
print (8,) * 3
Run Code Online (Sandbox Code Playgroud)
让我们说,例如
nums = [5] * 3
print map(id, nums)
Run Code Online (Sandbox Code Playgroud)
在我的机器上输出
[41266184, 41266184, 41266184]
Run Code Online (Sandbox Code Playgroud)
id
function给出当前对象的唯一id.如您所见,以这种方式创建不可变对象非常简单,高效.因为创建的对象中的所有元素都指向同一个元素.(记住使用的对象是不可变的)
所以,根据经验,
如果对象是可变的,请使用列表推导表单
[Foo() for i in range(3)]
Run Code Online (Sandbox Code Playgroud)
如果对象是不可变的,则可以使用星形
[5] * 3
Run Code Online (Sandbox Code Playgroud)