【问题标题】:Update on list/dictionary works but I don't know why更新列表/字典作品,但我不知道为什么
【发布时间】:2018-04-15 23:20:39
【问题描述】:

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

当我使用 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)

【问题讨论】:

    标签: python


    【解决方案1】:

    您的 item 不是 None,因此 else 子句会更新字典:

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

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

    然后 item 指的是管道对象(这是您列表中的唯一元素)。更新它会改变它的内容。你可以看到 item 和你的 list 指向同一个元素:

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

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

    【讨论】:

    • 嗨。谢谢您的回答。我知道我的项目不是无。只是我不明白为什么 line item.update 也会更新列表“项目”。谢谢。
    • @Koko 我明白了。我已经更新了我的答案,看看它是否能帮助你更好地理解这一点
    • 感谢您提供更新的答案。总是这样吗?你知道我如何创建一个新变量“item”,我可以在不更新“items”的情况下更新它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2018-02-04
    • 1970-01-01
    • 2017-08-09
    • 2016-02-13
    • 2021-04-28
    • 2013-10-21
    相关资源
    最近更新 更多