删除python字典之间的依赖关系[重复]

Posted

技术标签:

【中文标题】删除python字典之间的依赖关系[重复]【英文标题】:Remove dependency between python dictionaries [duplicate] 【发布时间】:2018-08-14 01:33:14 【问题描述】:

我有一个关于我还没有看到的 python 字典行为的问题。 (我用的是python3.6)

我有一个字典 first_dict 包含两个键“kk”和“aa”,它们都链接到一个列表。然后我制作了一个新的字典 namly second_dict。现在奇怪的是,每当我创建一个像 fractions 这样的变量并编辑这个值时,它会自动更新我的字典。所以我假设python自动在字典派生变量之间建立连接。

def main():

    first_dict = "kk": [0.0, 1.0], "aa": [0.5, 1.0]
    second_dict = first_dict
    fractions = second_dict["kk"]

    fractions.pop(0) #del fractions[0] gives same result
    print(first_dict)  #'kk': [1.0], 'aa': [0.5, 1.0]
    print(second_dict) #'kk': [1.0], 'aa': [0.5, 1.0]

if __name__ == "__main__":
    main()

我的问题是我可以删除这些连接吗,我找到了一个解决方案来删除 fractions 和我的 second_dict 之间的连接,方法是:

fractions = list(second_dict["kk"])

但是我找不到删除 first_dictsecond_dict 之间连接的解决方案。 所以我想改变 second_dict 并保持 first_dict 不变。

【问题讨论】:

您没有制作新词典。你只是再次引用它。 此行为的关键字是“可变的”,参见例如***.com/questions/24292174/are-python-lists-mutable 。您的second_dict 确实不是第二个字典,而是同一个字典的第二个名称。 @syntonym 我认为这里有两层误解,我在回答中详细说明了。 “重复”帖子中的第一个解决方案不能解决我的问题。所以 dict2 = dict(dict1) 和 dict2 = dict1.copy() 不起作用。怎么会? @candah:因为dict(dictionary)dictionary.copy()创建了一个shallow副本,所以values中包含的list对象仍然是共享的。 【参考方案1】:

您真正想说的是,您希望 first_dictsecond_dict 指向不同的对象,而不是同一个对象

这可以通过替换来完成 second_dict = first_dict

from copy import deepcopy
second_dict = deep_copy(first_dict)

【讨论】:

谢谢这个作品【参考方案2】:

它与字典无关。

首先,您从未制作过新字典(浅拷贝)。为此:

new_dictionary = dict(old_dictionary)

其次,列表是可变的。当您进行浅拷贝时,您对键值具有相同的引用,因此在引用它的任何地方都会对对象进行变异。 也许你想deepcopy:

from copy import deepcopy
new_dictionary = deepcopy(old_dictionary)

更好的方法是尽可能使用不可变对象(list 的等价物通常是 python 中的tuple)。

【讨论】:

谢谢你的解释,现在更清楚了!

以上是关于删除python字典之间的依赖关系[重复]的主要内容,如果未能解决你的问题,请参考以下文章

模块之间的Python依赖关系[重复]

在python中转置(旋转)列表的字典[重复]

Python序列结构--字典

python字典的简单操作(修改删除嵌套遍历复制)

在 Python 中删除列表中的重复字典

python中的字典