我有以下代码:
distances = [[100001] * 2] * 2
for edge in edges:
print(distances)
distances[edge[0]][edge[1]] = edge[2]
print(distances)
print("\n")
edges是以下元组列表:
edges = [(0, 1, 10), (1, 0, -9)]
我期待这个输出:
[[100001, 100001], [100001, 100001]]
[[100001, 10], [100001, 100001]]
[[100001, 10], [100001, 100001]]
[[100001, 10], [-9, 100001]]
但是我得到了这个输出:
[[100001, 100001], [100001, 100001]]
[[100001, 10], [100001, 10]]
[[100001, 10], [100001, 10]]
[[-9, 10], [-9, 10]]
任何想法有什么不对?
答案 0 :(得分:1)
试试这段代码:
>>> distances[0] is distances[1]
你会得到真的。这意味着它们是相同的对象,因此当您修改距离[0]时,您也将修改距离[1]。因为距离[0]是距离[1],所以它们不能不同。
如何避免它?只需将您的代码更改为:
distances = [[100001] * 2] + [[100001] * 2]
现在距离[0]和距离[1]是两个完全不同的对象,因此您可以在不修改另一个对象的情况下修改它们。
现在您可能想知道为什么2 *列表与列表+列表不同。可以简单地解释一下:
Lests假设您有2个列表:
a = [100001, 100001]
b = [100001, 100001]
c = a
很明显,当你修改a时你不会修改b。但是,修改a将修改c中的值,因为IS c。
现在,如果你按照自己的方式定义距离:
distances = a*2 # You will simply get [a, a]
#so distances[0] cannot be different than distances[1]
如果按我的方式定义距离:
distances = a+b # you will get [a, b]