Python 为什么列表的值即使没有直接引用也会发生变化?

Python 为什么列表的值即使没有直接引用也会发生变化?,python,list,matrix,Python,List,Matrix,我编写了一个python代码,使用列表列表作为称为矩阵的邻接矩阵。但当我用这个矩阵的副本创建一个实验的实例,然后修改它的值时,我注意到不仅修改了矩阵的副本,而且修改了原始副本“矩阵” 下面是代码块,我在其中更改了名为“acopy”的矩阵副本的值。随着“acopy”值的每次更改;“adummy”和“matrix”也发生了变化 def main(): n = 20 k = 4 matrix = [[0 for x in xrange(n)] for x in xran

我编写了一个python代码,使用列表列表作为称为矩阵的邻接矩阵。但当我用这个矩阵的副本创建一个实验的实例,然后修改它的值时,我注意到不仅修改了矩阵的副本,而且修改了原始副本“矩阵”

下面是代码块,我在其中更改了名为“acopy”的矩阵副本的值。随着“acopy”值的每次更改;“adummy”和“matrix”也发生了变化

def main():
    n = 20  
    k = 4 

    matrix = [[0 for x in xrange(n)] for x in xrange(n)]

    matrix[0][n-2], matrix[0][n-1] = 1,1
    matrix[1][n-1], matrix[n-1][n-2] = 1,1

    for i in xrange(n-2):
        matrix[i][i+1] = 1
        matrix[i][i+2] = 1

        if i - 2 >= 0:
            matrix[i][i-1], matrix[i][i-2] = 1,1

    for i in xrange(n):
        for j in xrange(n):
            if matrix[i][j] == 1 or matrix[j][i]==1:
                matrix[i][j], matrix[j][i] = 1,1

    aver_cluster = []
    char_length = []
    probs = []

    adummy = matrix

    for rewiring_prob in drange(0.00, 1.00, 0.001):
        probs.append(rewiring_prob)
        acopy = [[0 for x in xrange(n)] for x in xrange(n)]
        acopy = adummy

        for p in xrange(1, k/2 +1):
            for x in xrange(n):
                rand_prob = random.random()

                if rand_prob < rewiring_prob:
                    b = random.randint(0,n-1)

                    if acopy[x][b] != 1 and x != b and x+p < n:
                        acopy[x][b], acopy[b][x] = 1,1
                        acopy[x][x+p], acopy[x+p][x] = 0,0
                    elif acopy[x][b] != 1 and x != b and x+p >= n:
                        acopy[x][b], acopy[b][x] = 1,1
                        acopy[x][x+p-n], acopy[x+p-n][x] = 0,0          

    return 2
def main():
n=20
k=4
矩阵=[[0表示x范围内的x(n)]表示x范围内的x(n)]
矩阵[0][n-2],矩阵[0][n-1]=1,1
矩阵[1][n-1],矩阵[n-1][n-2]=1,1
对于X范围内的i(n-2):
矩阵[i][i+1]=1
矩阵[i][i+2]=1
如果i-2>=0:
矩阵[i][i-1],矩阵[i][i-2]=1,1
对于x范围内的i(n):
对于X范围内的j(n):
如果矩阵[i][j]==1或矩阵[j][i]==1:
矩阵[i][j],矩阵[j][i]=1,1
平均聚类=[]
字符长度=[]
probs=[]
adummy=矩阵
对于drange(0.00,1.00,0.001)中的重新布线探头:
问题附加(重新布线问题)
acopy=[[0表示x范围内的x(n)]表示x范围内的x(n)]
成人
对于X范围内的p(1,k/2+1):
对于x范围内的x(n):
rand_prob=random.random()
如果随机概率<重新布线概率:
b=随机随机随机数(0,n-1)
如果复制[x][b]!=1和x!=b和x+p=n:
acopy[x][b],acopy[b][x]=1,1
acopy[x][x+p-n],acopy[x+p-n][x]=0,0
返回2
我的问题是如何保持原始副本的值不变?
第二,为什么会发生这种情况?那就是没有原始列表的任何引用,为什么要修改它?

acopy=adummy
创建对列表的引用,而不是副本,您需要
acopy=adummy[:]
来创建副本

In [7]: adummy = [1,2,3]

In [8]: acopy = adummy

In [9]: adummy is acopy
Out[9]: True

In [10]: acopy = adummy[:]

In [11]: adummy is acopy
Out[11]: False

acopy=adummy
使acopy指向内存中的同一对象,因此对
acopy
的任何更改都将影响
adummy
,反之亦然

对于列表列表,请使用:


adummy=matrix
也只是创建对
matrix
列表的引用,因此您需要执行相同的操作。

acopy=adummy[:]
只会创建一个浅显的副本,因此对列表没有多大帮助。
import copy
acopy = copy.deepcopy(adummy)