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

标签 python list dictionary del

考虑以下代码

#! /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/

相关文章:

python - 类型错误 : unhashable type: 'list' when dynamically creating 'variables'

Python-将文件导入到多个数组、字典、元组中

python - 我需要将列表拆分为列表列表 [Python]

python - 编写扩展时如何在 Python 和 C 之间传递空指针?

python - 在 Python 中使用列表理解查找长方体的坐标

python - 如何在 Python 中从字典中提取和划分值?

python - 为什么 Python 的 sorted() 方法不会反转字典中具有相同值的键的顺序?

c++ - 使用字符串映射 vector C++ 时可能存在内存泄漏

python - py.test 日志控制

python - 如何创建一个循环来读取 python 脚本中的多个图像?