Python函数内存溢出

Python函数内存溢出,python,pandas,Python,Pandas,我有一个传递变量的函数。我不会更改变量的名称 我希望函数内的变量被视为局部变量,但在某些情况下,它似乎实际更改了函数外同名的变量。我认为这不应该发生。有人经历过吗 所以,我有这个: def(df1,df2,df3) df1.set_index('A',inplace=True) df2['c'] = df1['B'] * df3['G'] return df2 我发现df1.set_index('A',inplace=True)正在函数外部更改df1。因此,当我再

我有一个传递变量的函数。我不会更改变量的名称

我希望函数内的变量被视为局部变量,但在某些情况下,它似乎实际更改了函数外同名的变量。我认为这不应该发生。有人经历过吗

所以,我有这个:

def(df1,df2,df3)

    df1.set_index('A',inplace=True)

    df2['c'] = df1['B'] * df3['G']

    return df2
我发现
df1.set_index('A',inplace=True)
正在函数外部更改
df1
。因此,当我再次调用该函数时,我得到一个错误,因为该函数在df1中没有“看到”df1['A']。它认为从“外部”传递的df1在前面的调用中已经将索引设置为“A”


任何人都会出现这种内存溢出?

在Python函数中,参数值是通过赋值传递的(传入的参数实际上是对对象的引用,但引用是通过值传递的),因此,如果修改
df1
,就是修改在函数中作为参数传递的数据帧

您可能想使用


注意:默认情况下,复制函数的
deep
参数为
True
,因此可能会使用内存,因为数据重复

在Python函数中,参数值是通过赋值传递的(传入的参数实际上是对对象的引用,但引用是通过值传递的),因此,如果修改
df1
,则修改的是在函数中作为参数传递的数据帧

您可能想使用


注意:默认情况下,复制函数的
deep
参数为
True
,因此可能会使用内存,因为数据重复

这正是您明确告诉它要做的,使用
inplace=True
。看见“我期望函数中的变量被视为局部变量”-具有可变值,这不是一个有用的期望。当传递
inplace=True
时,它会更改原始数据,因为两者都具有相同的引用。如果您不希望这样,请将不同的变量与
inplace=False一起使用。e、 g
df1=df1.set_index('A',inplace=False)
您的可能重复项似乎正在修改
df2
,但返回
df3
-这相当混乱@sam@jonrsharpe所以
in place
超越了我的局部变量状态?不只是更改与函数外部名称相同的局部变量,而是在两个位置更改它?这正是您明确告诉它要做的,使用
inplace=True
。看见“我期望函数中的变量被视为局部变量”-具有可变值,这不是一个有用的期望。当传递
inplace=True
时,它会更改原始数据,因为两者都具有相同的引用。如果您不希望这样,请将不同的变量与
inplace=False一起使用。e、 g
df1=df1.set_index('A',inplace=False)
您的可能重复项似乎正在修改
df2
,但返回
df3
-这相当混乱@sam@jonrsharpe所以
in place
超越了我的局部变量状态?与其只更改与函数外部名称相同的局部变量,还不如在两个位置都更改它?请停止使用不合适的术语。如果python使用“按引用传递”,则重新绑定函数中的参数也会影响调用方命名空间,事实并非如此。@Brunodesshuilliers已更正。请停止使用不适当的术语。如果python使用“按引用传递”,那么在函数中重新绑定参数也会影响调用方名称空间,事实并非如此。@Brunodesshuilliers。
def func(df1,df2,df3):
    df1 = df1.copy()
    df1.set_index('A',inplace=True)

    df2['c'] = df1['B'] * df3['G']

    return df3