更改循环python3的列表

时间:2012-11-27 09:37:59

标签: list for-loop python-3.x

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

但如果您打印a1,则为'0',但[a1,a2,a3]"" "" ""

1 个答案:

答案 0 :(得分:2)

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

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

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

修改

说你有这样的事情:

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

您希望a的更改能够反映在arr的两个子列表中,然后您需要执行以下两项操作之一:

  1. 将这些变量转换为对象
  2. arr中的索引存储到单独的列表(不太好)
  3. 两者都有原因,但由于你可能想要做#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起作用。有关详细信息,请参阅上一篇文章here

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

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