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
答案 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]]