Python更新不同的变量而不是分配的参考变量[重复]

Posted

技术标签:

【中文标题】Python更新不同的变量而不是分配的参考变量[重复]【英文标题】:Python updating different variable instead of assigned reference variable [duplicate] 【发布时间】:2021-05-25 02:37:09 【问题描述】:

解决方案:test_dict = copy.deepcopy(DICT) 谢谢各位游戏玩家。将来可以轻松调试。

我创建了字典的副本,并将更改附加到新变量。 更改出现在旧变量中。

CHARACTERS = ['A', 'G', 'T', 'C', 'C', 'A', 'G', 'T', 'G', 'T', 'A', 'A']
DICT = 'key1': "foo", 'key2': "bar", 'key3': CHARACTERS

def test(self):
    test_dict = DICT.copy()  # first reference of 'test_dict'
    print("DICT before", DICT)
    test_dict['sequence'] += ['G']
    print("DICT after ", DICT)

输出:

DICT before 'key1': "foo", 'key2': "bar", 'key3': ['A', 'G', 'T', 'C', 'C', 'A', 'G', 'T', 'G', 'T', 'A', 'A']
DICT after  'key1': "foo", 'key2': "bar", 'key3': ['A', 'G', 'T', 'C', 'C', 'A', 'G', 'T', 'G', 'T', 'A', 'A', 'G']

字母“G”附加到 DICT 和 test_dict。

如果你问我的话,完全是诡异的。

更新:我已经尝试了建议的:test_dict = DICT.copy(),但没有运气。在包含此内容的上述更新代码中我做错了什么?

【问题讨论】:

nedbatchelder.com/text/names.html 【参考方案1】:

您不创建副本,而是创建参考。两个变量都指向同一个内存。如果要创建不更改“原始”的精确副本,则应使用test_dict = DICT.copy()。这会创建一个浅拷贝(不复制嵌套的字典/列表)。为了解决这个问题,需要一个深拷贝。一种获取方法是使用copy模块中的copy.deepcopy函数

import copy

CHARACTERS = ['A', 'G', 'T', 'C', 'C', 'A', 'G', 'T', 'G', 'T', 'A', 'A']
DICT = 'key1': "foo", 'key2': "bar", 'key3': CHARACTERS

def test():
    test_dict = copy.deepcopy(DICT) # first reference of 'test_dict'
    print("DICT before", DICT)
    test_dict['key3'] += ['G']
    print("DICT after ", DICT)

test()

按预期输出:

DICT before 'key1': 'foo', 'key2': 'bar', 'key3': ['A', 'G', 'T', 'C', 'C', 'A', 'G', 'T', 'G', 'T', 'A', 'A']
DICT after  'key1': 'foo', 'key2': 'bar', 'key3': ['A', 'G', 'T', 'C', 'C', 'A', 'G', 'T', 'G', 'T', 'A', 'A']

【讨论】:

我知道这与指针有关!我有 ASM 和 C++ 的背景,但由于 Python 是高级别的,它为我们处理所有这些概念。 但是,我只是尝试了 'test_dict = DICT.copy()' 但没有运气 ;( 我的错,我马上编辑答案,你需要创建深拷贝(也复制嵌套的东西) 请查看编辑后的答案,希望这能解决您的问题

以上是关于Python更新不同的变量而不是分配的参考变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

静态变量赋值问题

什么时候应该使用动态内存分配函数而不是直接变量声明?

你不可能还不会python变量的类型吧?

当我将一个字典分配给另一个变量时,为啥 Python 会同时更新两个字典? [复制]

MAC python环境变量问题

文件所有者图标