gpt4 book ai didi

python - DEL 的行为从字典中获取列表

转载 作者:行者123 更新时间:2023-12-01 05:25:00 27 4
gpt4 key购买 nike

考虑以下代码

#! /usr/bin/env python

my_dict = {1:['Bernd','das','Brot'], 2:['Chili','das','Schaf'], 3:['Briegel','der','Busch']}
print my_dict

chili = my_dict[2]
print chili

del chili[2]
print chili
print my_dict

使用我的 Python 2.7.5 生成以下输出:

{1: ['Bernd', 'das', 'Brot'], 2: ['Chili', 'das', 'Schaf'], 3: ['Briegel', 'der', 'Busch']}
['Chili', 'das']
{1: ['Bernd', 'das', 'Brot'], 2: ['Chili', 'das'], 3: ['Briegel', 'der', 'Busch']}

如您所见,字典中的列表也被操作,因此它们似乎指向内存中的相同对象/事物。

也许我对 Python 基本原理的理解是错误的(请随意批评并指出规范),但这是预期的行为吗?如果是的话,有没有一种方法可以从字典中删除列表并按索引进行条目,而无需操作原始字典?我经常发现已经有一种非常简单的 Python 方法来完成我试图用复杂的代码结构来完成的事情。

我这里有一个很大的字典,我经常从中取出列表,并且我不想每次以任何方式处理列表时都重建字典。

非常感谢您的时间和帮助,

托比亚斯

最佳答案

是的,这是预期的行为。 Python 名称以及字典和列表中的条目仅仅是对实际对象的引用,存储在内存中的一大堆(堆)中。

因此,my_dict[2]chili 都引用同一个 list 对象,并且 list 对象是可变的。从 list 对象中删除条目意味着对该对象的所有引用都会看到更改。

如果您希望 chili 不是同一个列表对象,则必须创建一个副本。您可以使用以下任一方法创建浅副本:

chili = my_dict[2][:]

从第一个索引到最后一个索引的切片会生成一个新的列表对象,或使用:

chili = list(my_dict[2])

生成一个新的list对象,复制原始序列中存储的所有引用。

这些创建副本;如果 my_dict[2] 中的任何内容本身是可变的,您仍然可以操作 chili 列表和 my_dict[2] 列表之间共享的对象.

您可以使用 copy.deepcopy() function 创建深拷贝,它递归地生成对象的副本。

关于python - DEL 的行为从字典中获取列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21550658/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com