涉及Python嵌套列表的奇怪行为

时间:2014-04-06 21:12:27

标签: python list tuples

我有以下代码:

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

任何想法有什么不对?

1 个答案:

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