Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—更改列表列表中的元素_Python_List_Nested_Element - Fatal编程技术网

Python—更改列表列表中的元素

Python—更改列表列表中的元素,python,list,nested,element,Python,List,Nested,Element,我正在尝试更改列表列表中的一个元素。这是我的代码,我使用的是python版本3: myboard = [] colList = [] #makes a 2D list/array of the rows and colums for i in range(columns): colList.append(0) for x in range(rows): myboard.append(colList) myboard[0][1] = 999 print(myboard[0

我正在尝试更改列表列表中的一个元素。这是我的代码,我使用的是python版本3:

myboard = []

colList = []
#makes a 2D list/array of the rows and colums
for i in range(columns):
    colList.append(0)

for x in range(rows):
    myboard.append(colList)


myboard[0][1] = 999

print(myboard[0][1])

当我这样做时,它会将每个列表中的所有第1个元素更改为999。救命啊

您的错误是因为colList是指向列表的指针,而不是列表本身。 如果您想在
myboard
的每个元素中都有一个“独立”列表,您必须替换
myboard.append(colList)
with
myboard.append(colList.copy())

这样,myboard的每个元素都将是列表的副本。

简短解决方案:
正如Donbeo指出的,您必须将
myboard.append(colList)
替换为
myboard.append(colList.copy)

为什么?
因为在python中,当你引用任何可变对象(让我们称之为foo)时,它永远是一个精确的副本。例如
foo=[1,2,3]
bar=[foo,foo,foo]
使
bar=[1,2,3],[1,2,3],[1,2,3]
。现在让我们假设您将foo更改为
[3,2,1]
,然后条形图更新并成为
[[3,2,1],[3,2,1],[3,2,1]
。那么,
bar[0][1]=999
有什么问题呢。嗯,
bar[0]==foo
因此
bar[0][1]==foo[1]

现在在python中有一个简单的修复方法!列表有一个复制方法,该方法创建的复制副本在foo更改时不会更改。例如
foo=[1,2,3]
bar=[foo.copy,foo.copy]
;现在尝试
条[0][1]=999
。它的ALIVEIt工作正常。现在
bar[1][1]!=条形图[0][1]

演示

myboard.append(colList)
替换为
myboard.append(colList.copy())