1

我写了这段代码,但我无法弄清楚我到底做错了什么。我创建了“Route”类的两个实例,它们以某种方式共享“coords”列表的值。

import random

class Route():
    def __init__(self):
        self.coords = []  
        self.distance = 0
    def Generate(self, cities):
        random.shuffle(cities)
        self.coords = cities

class Citymap():
    def __init__(self, nr):
        self.Nr_of_cities = nr
        self.cities = []
    def Generate_map(self):
        for i in range(0, self.Nr_of_cities):
            self.cities.append((random.randint(0, 750), random.randint(0, 750)))


city = Citymap(6)
city.Generate_map()

a = Route()
a.Generate(city.cities)

b = Route()
b.Generate(city.cities)

print a.coords
print b.coords

a和b的输出:

[(429, 713), (336, 611), (555, 465), (397, 227), (222, 412), (491, 322)]
[(429, 713), (336, 611), (555, 465), (397, 227), (222, 412), (491, 322)]

a 和 b 应该是不同的实例,但不知何故,它们最终共享了“坐标”变量。有人可以帮我吗?

4

3 回答 3

1

问题不在于构造函数,而在于Generate函数。更改它以制作副本:

def Generate(self, cities):
    self.coords[:] = cities      # <<< note the [:]
    random.shuffle(self.coords)

否则,它不仅会改变传递给它的列表,还会保留对列表的引用self.coords,从而导致您描述的行为。

于 2013-01-05T16:42:46.910 回答
1

这很微妙,但是您正在分配城市数组并复制城市数组的地址。所以你没有传递city.citiesGenerate,你传递的是实际的数组本身,然后它在Generate函数的最后一行被分配。

您可以通过以下方式看到这一点:

print id(a.coords)
print id(b.coords)

我能够让它按预期工作,如下所示:

import random
from copy import copy

class Route():
    def __init__(self):
        self.coords = []  
        self.distance = 0
    def Generate(self, cities):
        random.shuffle(cities)
        self.coords = cities

class Citymap():
    def __init__(self, nr):
        self.Nr_of_cities = nr
        self.cities = []
    def Generate_map(self):
        for i in range(0, self.Nr_of_cities):
            self.cities.append((random.randint(0, 750), random.randint(0, 750)))


city = Citymap(6)
city.Generate_map()

a = Route()
a.Generate(copy(city.cities))

b = Route()
b.Generate((city.cities))
print a.coords
print b.coords
print a
print b
print id(a.coords)
print id(b.coords)
于 2013-01-05T16:50:38.097 回答
0

您必须克隆city.cities列表,否则它将在它们之间共享:

a = Route()
a.Generate(city.cities[:])

b = Route()
b.Generate(city.cities[:])
于 2013-01-05T16:39:42.007 回答