分享
三行代码  ›  专栏  ›  技术社区  ›  StressedBoi

Python更新不同的变量而不是指定的引用变量[duplicate]

  •  2
  • StressedBoi  · 技术社区  · 6 天前

    解决方案: 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\u DICT之后。

    如果你问我的话,我觉得很恐怖。

    test_dict = DICT.copy() 但是运气不好。我在上面更新的代码中犯了什么错误?

    1 回复  |  直到 6 天前
        1
  •  1
  •   Galunid    6 天前

    你不创建一个副本,而是创建一个引用。两个变量都指向相同的内存。如果要创建不更改“原件”的精确副本,应使用 test_dict = DICT.copy() copy.deepcopy 函数来自 copy 模块

    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']}