函数被调用对象的python矩阵中的整行而不是单个对象

时间:2017-06-27 05:03:31

标签: python-3.x

class temp:
 def __init__(self):
  self.a = 1
 def toggle(self):
  self.a ^= 1
 def __repr__(self):
  return str(self.a)

我有一个如上定义的类。 我用这个类做了一个矩阵

>>> matrix = [[temp()]*5 for x in range(5)]

当我这样做时,

>>> matrix #gives
[[1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1]]
>>> matrix[0][1].toggle()
[[0, 0, 0, 0, 0],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1]]

它应该只切换 [0] [1] 条目,而不是整个 0 行。 我在这里遗漏了什么? 我使用的是python 3.5.2

1 个答案:

答案 0 :(得分:1)

请注意,您正在使用带有对象的*运算符。

这不像您认为的那样有效 (你得到5个对同一个对象的引用):

lst = [Object()]*5

如果更改一个,其余部分会自动更改,因为它们在内存中引用相同的地址。

相反,请尝试:

class temp:
    def __init__(self):
        self.a = 1

    def toggle(self):
        self.a ^= 1

    def __repr__(self):
        return str(self.a)

matrix = [[temp() for _ in range(5)] for _ in range(5)]
print(matrix)
# [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]

matrix[0][0].toggle()
print(matrix)
# [[0, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]