我需要在Python中创建一个列表列表,所以我输入以下内容:
myList = [[1] * 4] * 3
Run Code Online (Sandbox Code Playgroud)
列表看起来像这样:
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)
然后我改变了最里面的一个值:
myList[0][0] = 5
Run Code Online (Sandbox Code Playgroud)
现在我的列表看起来像这样:
[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)
这不是我想要或期望的.有人可以解释一下发生了什么,以及如何解决这个问题?
假设我们有一个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的情况下这对我来说没有多大意义.
这个语法有没有其他真正有用的用例?