我有一个名为的嵌套列表basic
我想更改其中一项。我假设了以下行为:
expected = [ [9],[0] ]
unexpected = [ [9],[9] ]
basic = [ [0],[0] ]
basic[0][0] = 9
print(basic == expected) # this is true
然而,稍加修改就会产生令人惊讶的输出:
l = [0]
modified = [ l, l ]
modified[0][0] = 9
print(modified == expected) # this is false
print(modified == unexpected) # this is true
如果您的列表是用第二种方式定义的,则分配会将整列设置为 9。
这是设计使然吗?如果是这样,为什么?我在文档中找不到任何相关内容。
在你的第一个例子中:
basic = [ [0],[0] ]
您创建了一个包含两个不同列表对象的列表对象。您可以通过以下方式看到它们是不同的对象id()
或身份:
assert id(basic[0]) != id(basic[1])
assert basic[0] is not basic[1]
在你的第二个例子中:
l = [0]
modified = [ l, l ]
您已将同一个列表对象放入另一个列表两次。两个列表索引都引用同一个对象:
assert id(basic[0]) == id(basic[1])
assert basic[0] is basic[1]
所以,是的。这就是变量(以及它们指向的对象)在 Python 中的工作方式。
为了获得预期的行为,您需要创建单独的列表对象:
modified = [ l.copy(), l.copy() ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)