Python-我复制了一个列表,我在一个函数中传递了它,但是主列表仍然被修改
我的代码中有一些bug: 我有一个函数,它将修改一个列表并计算一些东西,并且只返回计算出的答案Python-我复制了一个列表,我在一个函数中传递了它,但是主列表仍然被修改,python,Python,我的代码中有一些bug: 我有一个函数,它将修改一个列表并计算一些东西,并且只返回计算出的答案 def calc_free_pos(S): State = S free_poses = [] for item in State: for n in item: if n == 0: free_poses.append([State.index(item), item.index(n)])
def calc_free_pos(S):
State = S
free_poses = []
for item in State:
for n in item:
if n == 0:
free_poses.append([State.index(item), item.index(n)])
item[item.index(n)] = "C"
return free_poses
我希望它返回的是列表中所有0的索引。
我给它输入:[[0,0,0],[0,0,0],[0,0,0]]
。
它做了它必须做的事情:给我输出:[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]
但是:它也修改了我给它的列表:[[“C”、“C”、“C”]、[“C”、“C”、“C”]、[“C”、“C”、“C”]
为什么会这样
我还复制了那个列表,不是一次,而是两次,它修改了原来的列表!
这是我的代码中的某种错误吗
以下是完整的代码:
StartState = [[0,0,0],[0,0,0],[0,0,0]]
def calc_free_pos(S):
State = S
free_poses = []
for item in State:
for n in item:
if n == 0:
free_poses.append([State.index(item), item.index(n)])
item[item.index(n)] = "C"
return free_poses
def is_full(State):
if calc_free_pos(State) == []:
return True
for x in range(1):
nS = StartState
S = nS
print(calc_free_pos(S))
print(StartState)
for item in calc_free_pos(S):
S[item[0]][item[1]] = 1
print(S)
请忽略
对于范围(1)零件中的x
谢谢你的回答 我想你只是做了一份浅拷贝而不是一份深拷贝。该帖子将解决您的问题:
使用浅拷贝时,您仅将原始列表的引用也提供给新列表。当您更改其中任何一项时,另一项也会更改。您认为您在哪里复制了列表?您没有在任何地方复制列表。请注意,由于您的列表包含列表,您可能需要一个deepcopy,不过,您可以只执行
state=[sub.copy()for sub in start_state]
不,根本没有复制,既不浅也不深。谢谢!但是有什么不同呢?只是给同一个列表对象分配了另一个名称。@juanpa.arrivillaga不不,我做了一个副本。请看for循环的前两行。@ananth这不是副本<代码>a=b根本不创建副本。请查看链接副本