1
a1 = '   '
a2 = '   '
a3 = '   '
b1 = '   '
b2 = '   '
b3 = '   '
c1 = '   '
c2 = '   '
c3 = '   '
boardspace = [[a1,a2,a3],[b1,b2,b3],[c1,c2,c3],[a1,b1,c1],[a2,b2,c2],[a3,b3,c3],[a1,b2,c3],[a3,b2,c1]]

while x != 'a'
    a1 = '0'
    a2 = '0'
    a3 = '0'
    for a in baordspace:
        if a[0]==a[1]==a[2]!= "  "
           x ='a'

ご覧のとおり、リストは常に印刷されます"" "" ""

a1 a2 a3for ループに入ることはありません'0'。なぜですか?

しかし、あなたがそれを印刷a1すると'0'、しかし[a1,a2,a3]"" "" ""

4

1 に答える 1

2

変数の意味を誤解していると思います。

リスト「boardspace」を作成すると、a1その時点で et al に含まれる値で作成されます。次に、変数a1et al を別の値に再割り当てします。

a1リストには、または他の変数は含まれませんが、文字列のリストです。それで全部です。

編集:

次のようなものがあるとします。

a = 1
b = 2
arr = [[a, b], [b, a]]

の両方のサブ リストに変更をa反映するにはarr、次の 2 つのいずれかを行う必要があります。

  1. これらの変数をオブジェクトに変換します
  2. インデックスをarr別のリストに保存します (あまり良くありません)

両方の理由がありますが、#1 を実行する可能性が高いため、例を次に示します。

class Tile:
    def __init__(self, val):
        self.val = val

    def __repr__(self):
        return self.val

    def __str__(self):
        return self.val

a = Tile('  ')
b = Tile('  ')

arr = [[a, b], [b, a]]

print arr # [[  ,   ], [  ,   ]]

a.val = '0'

print arr # [[0,   ], [  , 0]]

私はいくつかの魔法の関数を持つクラスを定義しました:

  • __init__- コンストラクター
  • __str__-str(obj)と同等obj.__str__()
  • __repr__- オブジェクトの表現を出力します。この場合、値は 1 つしかないためval、十分な表現です。それはまたprint arr仕事をします。詳細については、ここの最後の投稿を参照してください

ここでの変更点は、オブジェクトを作成したことです。Python はすべてを値渡しするため、作成したオブジェクトを配列に渡すときに参照がコピーされますが、基になるオブジェクトは同じです。

これは、これらのオブジェクトのいずれかに対する変更が、質問で予想したとおりに動作することを意味します。

于 2012-11-27T09:47:16.110 に答える