1

以下のようにColorクラスを定義しました。複数の色とそれぞれのノード ID (色を持つ) を保存する必要があるため、それらを保存するためののリストを作成しました。ただし、ノードの色が変更されるたびにリストの色を直接更新したくないので(別の関数が更新するかどうかを決定します)、決定関数を呼び出す前にのコピーを *tmp_colors* に保存する必要があります。結果がYesの場合、*tmp_colors*でを更新します。

新しいリスト *tmp_colors* のコピーを作成できましたが、*tmp_colors[0]* はまだcolors[0]を指しているため、両方のリストが更新されます。

  1. 色[0]のクラスオブジェクトのコピーを* tmp_colors [0] *に作成するにはどうすればよいですか?
  2. 後でcolor[0]を更新する場合、最善の方法は何ですか?
  3. 以下の例 (クラスを定義し、クラス オブジェクトのリスト) の代わりに、より良い設計はありますか?

class Color:
    __elems__ = "num", "nodelist",

    def __init__(self):
        self.num = 0
        self.num_bad_edge = 0

    def items(self):
        return [
                (field_name, getattr(self, field_name)) 
                 for field_name in self.__elems__]

def funcA():

    nodeCount = 2
    colors = []
    for i in range(0, nodeCount):
        colors.append(Color())

    colors[0].num = 2
    colors[0].nodelist = [10,20]
    colors[1].num = 3
    colors[1].nodelist = [23,33, 43]

    print "colors"
    for i in range(0, nodeCount):
        print colors[i].items()

    tmp_colors = list(colors)
    print "addr of colors:" 
    print id(colors)
    print "addr of tmp_colors:" 
    print id(tmp_colors)    
    print "addr of colors[0]:" 
    print id(colors[0])
    print "addr of tmp_colors[0]:" 
    print id(tmp_colors[0])

    tmp_colors[0].num = 2
    tmp_colors[0].nodelist = [10,21]

    print "\ntmp_colors"
    for i in range(0, nodeCount):
        print tmp_colors[i].items()

    print "\ncolors <<< have been changed"
    for i in range(0, nodeCount):
        print colors[i].items()

結果:

colors
[('num', 2), ('nodelist', [10, 20])]
[('num', 3), ('nodelist', [23, 33, 43])]
addr of colors:
32480840
addr of tmp_colors:
31921032
addr of colors[0]:
32582728
addr of tmp_colors[0]:
32582728                           <<<<<< --- expecting a new addr

tmp_colors
[('num', 2), ('nodelist', [10, 21])]
[('num', 3), ('nodelist', [23, 33, 43])]

colors <<< have been changed
[('num', 2), ('nodelist', [10, 21])]   <<<<<< --- expecting no change [10, 20]
[('num', 3), ('nodelist', [23, 33, 43])]
4

2 に答える 2