列表/词典的更新有效,但我不知道为什么

时间:2017-11-03 09:19:56

标签: python

我正在做一个教程,并且有一段我不理解的代码片段。它更新了一个字典(项目),但我不明白为什么主列表(项目)也会更新。

当我使用lambda函数或for。

过滤我的列表时,情况也是如此 你可以解释一下吗?提前谢谢。

items = [{'name': 'toto', 'price': 99}]

name = 'toto'

#item = next(filter(lambda x: x['name'] == name, items), None)

for x in items:
    if x['name'] == name:
        item = x
    else:
        item = None


print(item)
if item is None:
    item = {'name': name, 'price': 77}
    items.append(item)
else:
    item.update({'price': 100})
print(item)
print(items)

1 个答案:

答案 0 :(得分:0)

您的item不是None,所以else子句更新字典:

if item is None:
    item = {'name': name, 'price': 77}
    items.append(item)
else:
    item.update({'price': 100})

你的列表中有一个元素,一个字典。当您遍历列表时,您将获得对元素的引用。 Dicts是可变的,所以你可以改变它们。

然后item引用管道对象(这是列表中唯一的元素)。更新它会更改其内容。您可以看到项目和列表指向相同的元素:

id(item) == id(items[0])

它是同一个对象,因此当您更改它时 - 您的列表项也会更改。