Python 3.1.1中数组引用的初学者问题

1 投票
1 回答
676 浏览
提问于 2025-04-15 21:14

在我参加的初学者Python编程课程的最后一个作业中,我被分配了一个旅行推销员问题。我决定使用递归函数来找到每种排列方式以及目的地之间距离的总和,不过,我在处理引用方面遇到了很多问题。在TSP的Permute和Main函数的不同实例中,数组似乎指向了同一个引用。

from math import sqrt
    class TSP:
        def __init__(self):
            self.CartisianCoordinates = [['A',[1,1]], ['B',[2,2]], ['C',[2,1]], ['D',[1,2]], ['E',[3,3]]]
            self.Array = []
            self.Max = 0
            self.StoredList = ['',0]
        def Distance(self, i1, i2):
            x1 = self.CartisianCoordinates[i1][1][0]
            y1 = self.CartisianCoordinates[i1][1][1]
            x2 = self.CartisianCoordinates[i2][1][0]
            y2 = self.CartisianCoordinates[i2][1][1]
            return sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2))

    def Evaluate(self):
        temparray = []
        Data = []
        for i in range(len(self.CartisianCoordinates)):
            Data.append([])
        for i1 in range(len(self.CartisianCoordinates)):
            for i2 in range(len(self.CartisianCoordinates)):
                if i1 != i2:
                    temparray.append(self.Distance(i1, i2))
                else:
                    temparray.append('X')
            Data[i1] = temparray
            temparray = []
        self.Array = Data
        self.Max = len(Data)
    def Permute(self,varray,index,vcarry,mcarry): #Problem Class
        array = varray[:]
        carry = vcarry[:]
        for i in range(self.Max):
            print ('ARRAY:', array)
            print (index,i,carry,array[index][i])
            if array[index][i] != 'X':
                carry[0] += self.CartisianCoordinates[i][0]
                carry[1] += array[index][i]
                if len(carry) != self.Max:
                    temparray = array[:]
                    for j in range(self.Max):temparray[j][i] = 'X'
                    index = i
                    mcarry += self.Permute(temparray,index,carry,mcarry)
                else:
                    return mcarry
        print ('pass',mcarry)
        return mcarry
    def Main(self):
        out = []
        self.Evaluate()
        for i in range(self.Max):
            array = self.Array[:] #array appears to maintain the same reference after each copy, resulting in an incorrect array being passed to Permute after the first iteration.
            print (self.Array[:])
            for j in range(self.Max):array[j][i] = 'X'
            print('I:', i, array)
            out.append(self.Permute(array,i,[str(self.CartisianCoordinates[i][0]),0],[]))
        return out


SalesPerson = TSP()
print(SalesPerson.Main())

如果你能帮我解决我遇到的引用问题,我将非常感激。谢谢。

1 个回答

0

[:] 这种方式切片一个列表,其实并不会创建一个完全独立的副本,而是创建了一个“浅拷贝”。这是什么意思呢?就是说,如果这个列表里面有其他列表的引用,拷贝出来的列表还是会指向那些原来的列表,而不是新建一份列表。换句话说,只有列表本身被复制了,而它里面的元素或者元素的元素并没有被复制。

你想要的是一个“深拷贝”。也就是说,想要每个元素都独立开来,而不是共享同一个引用。你可以用下面的方式来实现:

array = self.Array[:]

试试这个

array = copy.deepcopy(self.Array)

不过你需要先用 import copy 来导入相关的功能。

撰写回答