带嵌套列表的Python传递值?

带嵌套列表的Python传递值?,python,Python,我有一个让我沮丧的简单问题。我肯定我犯了一个非常明显的错误,但我似乎找不到它。在进行迭代之前,我希望l_old是l的副本。我有以下Python脚本 import random def runtest(n,steps): l=[] for i in range(n): sublist=[] for j in range(n): sublist.append(0) l.append(sublist)

我有一个让我沮丧的简单问题。我肯定我犯了一个非常明显的错误,但我似乎找不到它。在进行迭代之前,我希望
l_old
l
的副本。我有以下Python脚本

import random
def runtest(n,steps):
    l=[]
    for i in range(n):
        sublist=[]
        for j in range(n):
            sublist.append(0)
        l.append(sublist)


    for k in range(n-1):
        i = random.randint(0,n-1)
        j = random.randint(0,n-1)
        while(l[i][j]==1):
            i = random.randint(0,n-1)
            j = random.randint(0,n-1)
        l[i][j]=1
    l_old = list(l)
    print("L_OLD BEFORE ITERATION", l_old)
    for k in range(steps):
        for i in range(n):
            for j in range(n):
                num = 0
                if i is not 0:
                    num+=l[i-1][j]
                if i is not n-1:
                    num+=l[i+1][j]
                if j is not 0:
                    num+=l[i][j-1]
                if j is not n-1:
                    num+=l[i][j+1]
                if(num > 1):
                    l[i][j]=1
    print("L_OLD AFTER ITERATION",l_old)
    return sum([sum(item) for item in l]), l_old, l
但是,我的输出将如下所示:

BEFORE ITERATION [[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [1, 0, 1, 0, 0], [0, 0, 0, 0, 0], [1, 0, 0, 0, 0]]
AFTER ITERATION: [[0, 0, 0, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0]]
因此,即使我复制了
l
的值,而不是
l
的引用,它也在改变。我尝试了
l[:]
,结果也一样。我错过了什么?我认为这与它是一个嵌套列表这一事实有关,但是我如何编写它以使所有嵌套列表都按值复制呢

我认为这与它是一个嵌套列表这一事实有关

对。你做了一个浅拷贝:

l_old = list(l)
使用
l[:]
进行切片也是一种浅拷贝

但如何编写它,使所有嵌套列表都按值复制

尝试深度复制:

from copy import deepcopy
l_old = deepcopy(l)