Python从内部函数更改外部字典

标签 python pointers dictionary copy

据我所知,我遇到了一种在 Python 中很常见的行为,但我想知道这是默认设置,以及如何防止这种情况发生。考虑以下代码:

dic1 = {'a':1, 'b':2}
lis1 = [1, 2]

def somefunc(dic):
    dic.update({'b':20})
    return dic

def otherfunc(lis):
    lis.append(20)
    return lis

for i in range(3):
    dic2 = dic1
    lis2 = lis1
    print(dic2)
    somefunc(dic2)
    print(lis2)
    otherfunc(lis2)

我们运行这段代码,它输出

{'a': 1, 'b': 2}
[1, 2]
{'a': 1, 'b': 20}
[1, 2, 20]
{'a': 1, 'b': 20}
[1, 2, 20, 20]

但是为什么不输出以下内容呢?

{'a': 1, 'b': 2}
[1, 2]
{'a': 1, 'b': 2}
[1, 2]
{'a': 1, 'b': 2}
[1, 2]

我觉得它应该输出这个,因为我正在重置 dic2lis2。为什么这是默认行为? Python 不应该在进入函数后复制一份 dic2 吗?难道 dic2=dic1 不应该创建 dic1 的副本,而不是创建指向内存中同一位置的不同指针吗? (如果这确实是正在发生的事情)

我可以通过将 dic2 = dic1 替换为 dic2 = dic1.copy()(或添加 dic=dic.copy() 到函数中),但是我如何用列表来做呢?他们没有复制方法。此外,有没有一种方法可以让我在默认情况下避免这种情况,而不必记住每次在函数内部处理字典(或者甚至可能是 Pandas 数据帧等)时都使用复制方法?

干杯

最佳答案

在 Python 上,列表是可变的,这意味着 lis2 只是 lis1 的另一个名称,因此它们是同一个对象

这里有两种方法可以在 lis2 上复制 lis1:

lis2 = lis1[:]

lis2 = list(lis1)

我更喜欢使用 list(),因为它更具可读性。

关于Python从内部函数更改外部字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37532111/

相关文章:

python - 如何获取两个具有不同父级的 QWidget 的几何图形的交集?

python - 将单词与字典进行比较并赋值

python - 字典理解中的 if-else

swift - 可选绑定(bind)不会解开字典

python - 我应该如何使用 pandas 从数据框中的列接收第一个字符串?

c - 为什么会出现段错误?

c++ - 指针逻辑

c++ - vector 迭代器 C++

python - 基于列表列表python的第一个元素的平均值

python对象类型转换