局部变量在Python中被无意更改

局部变量在Python中被无意更改,python,pandas,function,dataframe,variables,Python,Pandas,Function,Dataframe,Variables,我有一个数据帧“df”,我在它上面应用了几个函数。 我不想更改原始数据帧的值。 我的所有函数如下所示: def func(x): # do some stuff with x return x y = func(x=df) 我没有在函数中引用df变量。但是变量还是会改变的。有人能给我解释一下为什么会这样以及如何避免这种情况吗?发送数据帧的深度副本 y = func(x=df.copy()) 默认情况下,它是一个deepcopy。Python是通过引用传递的df是可变的。您正在将对df的引

我有一个数据帧“df”,我在它上面应用了几个函数。 我不想更改原始数据帧的值。 我的所有函数如下所示:

def func(x):
# do some stuff with x
return x

 y = func(x=df)

我没有在函数中引用df变量。但是变量还是会改变的。有人能给我解释一下为什么会这样以及如何避免这种情况吗?

发送数据帧的深度副本

y = func(x=df.copy())

默认情况下,它是一个deepcopy。

Python是通过引用传递的<代码>df是可变的。您正在将对
df
的引用传递给正在对其进行变异的方法。如果您想保持原始文件的完整性,请发送一份
df
@rd的副本,因为Python不是通过引用传递的。Python使用一种称为的评估策略。这不是一个众所周知的名称,有时被称为“分配调用”,或者如果在Java社区中,则称为“所有值都是引用的值调用”。不管你想叫它什么,它都不是通过引用来调用的。这里通过引用调用的区别在于,调用方可以看到对参数的赋值,这在python中是不会发生的。这将传递到一个浅拷贝中,这可能就足够了:)@Mars不符合it will。它说,
deep default是真的
Good catch!我忘了那是一个熊猫数据帧。默认情况下,Python的copy()是浅层的。哎呀!