我需要在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)
这不是我想要或期望的.有人可以解释一下发生了什么,以及如何解决这个问题?
我正在尝试列出大约5000个列表的列表,它一直搞乱.
现在我就是这样做的:
array = [[]]*5000
for line in f2:
a = line.split()
grid = int(a[0])
array[grid].append(a[1])
print Counter(array[0]).most_common(10)
Run Code Online (Sandbox Code Playgroud)
问题是,当我创建计数器时,它就像整个列表实际上只是一个列表一样.有什么明显的东西我做错了吗?谢谢
编辑:这个问题是关于为什么这种行为是这样的,而不是如何绕过它,这就是所谓的重复的内容。
我使用以下符号在不同情况下创建特定大小的列表。例如:
>>> [None] * 5
[None, None, None, None, None]
>>>
Run Code Online (Sandbox Code Playgroud)
这似乎按预期工作并且短于:
>>> [None for _ in range(5)]
[None, None, None, None, None]
>>>
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用相同的方法创建列表列表:
>>> [[]] * 5
[[], [], [], [], []]
>>>
Run Code Online (Sandbox Code Playgroud)
很公平。它似乎按预期工作。
然而,在检查调试器时,我注意到所有子列表存储桶都具有相同的值,即使我只添加了一个项目。例如:
>>> t = [[]] * 5
>>> t
[[], [], [], [], []]
>>> t[1].append(4)
>>> t
[[4], [4], [4], [4], [4]]
>>> t[0] is t[1]
True
>>>
Run Code Online (Sandbox Code Playgroud)
我并不期望所有顶级数组元素都是对单个子列表的引用;我期望有 5 个 …