1

私はこのコードを書きましたが、正確に何が間違っていたのかわかりません。「Route」クラスの 2 つのインスタンスを作成し、どういうわけか「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 は異なるインスタンスである必要がありますが、どういうわけか「coords」変数を共有してしまいます。誰か助けてくれませんか?

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

微妙ですが、citys 配列を割り当てて、citys 配列のアドレスをコピーしています。に渡すのではなく、実際の配列自体を渡すと、関数の最後の行で割り当てられcity.citiesます。GenerateGenerate

これは、次のようにして確認できます。

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 に答える