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 a3永远不会'0'在for循环中,这是为什么呢?

但是,如果您打印a1它是,'0'但是[a1,a2,a3]"" "" ""

4

1 回答 1

2

我认为您误解了变量的含义。

当您创建列表“boardspace”时,您正在使用a1et al 当时包含的值创建它。然后您将变量a1et al 重新分配给不同的值。

该列表不包含a1或任何其他变量,而是字符串列表。就这样。

编辑:

假设你有这样的事情:

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

并且您希望更改a反映在 中的两个子列表中arr,那么您需要执行以下两项操作之一:

  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__- 输出对象的表示。在这种情况下,我们只有一个值,因此val是一个充分的表示。它也使print arr工作。有关更多信息,请参阅此处的最后一篇文章

这里的变化是我们创建了一个对象。Python 通过值传递所有内容,因此当它将我们创建的对象传递给数组时,引用被复制,但底层对象是相同的。

这意味着对任何这些对象的任何更改都将按照您在问题中的预期表现。

于 2012-11-27T09:47:16.110 回答