【问题标题】:changing list for loop python3更改循环python3的列表
【发布时间】:2012-11-27 09:37:59
【问题描述】:
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]"" "" ""

【问题讨论】:

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


【解决方案1】:

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

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

该列表不包含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 工作。更多信息请查看最后一篇帖子here

这里的变化是我们创建了一个对象。 Python通过值传递所有东西,所以当它把我们创建的对象传递给数组时,引用被复制了,但底层对象是一样的。

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

【讨论】:

  • 所以 tjameson 你是说我必须创建一个新列表?
  • 这取决于你想要做什么。最简单的方法是为每个变量创建对象。以我的编辑为例。
猜你喜欢
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2016-07-21
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多