0

だから私はcellと呼ばれるクラスを持っています:

class cell:
    possibles = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
    value = None;

    def __init__(self, value):
        if value == "":
            self.value = "0"
        else:
            self.value = value

if __name__=="__main__":
    mlist = [cell("2"), cell("6"), cell("8")]
    mlist[2].possibles.remove("3")
    print mlist[0].possibles

出力は次のとおりです。

['1', '2', '4', '5', '6', '7', '8', '9']

3番目の項目から値を明示的に削除したときに、配列の最初の項目の可能性から値を削除するのはなぜですか?

4

4 に答える 4

2

これは一般的なPythonの落とし穴です。これが書かれている方法はすべてcell、同じリストインスタンスへの参照を持っています。id(mlist[i].possibles)ごとに印刷することで確認できますi

個別のリストを作成するには、初期化をコンストラクターに移動します。

def __init__(self, value):
    self.possibles = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
于 2012-10-16T01:12:24.637 に答える
1

これはpossibilities、インスタンス変数ではなくクラス変数として定義したために発生します。

(as )に移動possibilitiesすると、元気になるはずです__init__self.possibilities

于 2012-10-16T01:11:50.430 に答える
1
mlist = [cell("2"), cell("6"), cell("8")]

ここでは、3つの異なるリストはありませんが、同じリストへの3つの参照があります。変更はすべてに影響します。

于 2012-10-16T01:16:55.437 に答える
0

他の人が言ったように、インスタンス変数を可能にする必要があります。value パラメータのデフォルトを 0 にすることで、if...else 句を使用しなくても済みます。

    class cell:
        def __init__(self, value=0):
            self.possibles = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
            self.value = value

    if __name__=="__main__":
        mlist = [cell("2"), cell("6"), cell("8")]
        mlist[2].possibles.remove("3")


>>> mlist[0].possibles
['1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> mlist[2].possibles
['1', '2', '4', '5', '6', '7', '8', '9']
>>> 
于 2012-10-16T01:23:02.690 に答える