我需要在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)
这不是我想要或期望的.有人可以解释一下发生了什么,以及如何解决这个问题?
我在Python中使用嵌套列表时遇到了一些问题.
基本上,我有一个包含所有0值的2D列表,我想在循环中更新列表值.
但是,Python不会产生我想要的结果.有什么我误解range()和Python列表索引?
some_list = 4 * [(4 * [0])]
for i in range(3):
for j in range(3):
some_list[i+1][j+1] = 1
for i in range(4):
print(some_list[i])
Run Code Online (Sandbox Code Playgroud)
我期望的结果是:
[0, 0, 0, 0]
[0, 1, 1, 1]
[0, 1, 1, 1]
[0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)
但是Python的实际结果是:
[0, 1, 1, 1]
[0, 1, 1, 1]
[0, 1, 1, 1]
[0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
我确信这已在某个地方得到解答,但我不确定如何描述它.
假设我想创建一个包含3个空列表的列表,如下所示:
lst = [[], [], []]
Run Code Online (Sandbox Code Playgroud)
这样做我以为我很聪明:
lst = [[]] * 3
Run Code Online (Sandbox Code Playgroud)
但是我发现,在调试了一些奇怪的行为之后,这导致了对一个子列表的追加更新,比如lst[0].append(3),更新整个列表,[[3], [3], [3]]而不是[[3], [], []].
但是,如果我用列表初始化列表
lst = [[] for i in range(3)]
Run Code Online (Sandbox Code Playgroud)
然后做lst[1].append(5)了预期的[[], [5], []]
我的问题是为什么会发生这种情况?有趣的是,如果我这样做
lst = [[]]*3
lst[0] = [5]
lst[0].append(3)
Run Code Online (Sandbox Code Playgroud)
那么单元格0的"连接"就被打破了[[5,3],[],[]],但是我得到了,但lst[1].append(0)仍然会导致[[5,3],[0],[0].
我最好的猜测是在表单中使用乘法[[]]*x会导致Python存储对单个单元格的引用......?
在Python中,如果我将对象列表乘以整数,我会得到一个对该对象的引用列表,例如:
>>> a = [[]] * 3
>>> a
[[], [], []]
>>> a[0].append(1)
>>> a
[[1], [1], [1]]
Run Code Online (Sandbox Code Playgroud)
如果我想要的行为是创建原始对象的副本列表(例如,通过"copy.copy()"方法或某种标准创建的副本,是否有一种优雅的方法可以使用相同的乘法运算符执行此操作?或者我应该坚持列表理解还是什么?例如
[[] for x in range(0,3)]
Run Code Online (Sandbox Code Playgroud)
任何版本的Python都可以.
我很安静,因为下面用python来解决这个问题
>>> a = [[]]*3
>>> c=[[],[],[]]
>>> a
[[], [], []]
>>> c
[[], [], []]
>>> a == c
True
>>> a[1].append(2)
>>> a
[[2], [2], [2]]
>>> c[1].append(2)
>>> c
[[], [2], []]
Run Code Online (Sandbox Code Playgroud)
我猜的原因是在变量a中,所有三个列表都会向相同的内存区域发送,直到它们以不同的方式使用.这样对吗?使用*运算符之类的东西进行初始化时,我是否应该始终小心?谢谢!