Python-我复制了一个列表,我在一个函数中传递了它,但是主列表仍然被修改

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)])

我的代码中有一些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)])
                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根本不创建副本。请查看链接副本