将数据帧传递给函数时,pandas 何时执行按引用传递与按值传递?

When does pandas do pass-by-reference Vs pass-by-value when passing dataframe to a function?

def dropdf_copy(df):
    df = df.drop('y',axis=1)

def dropdf_inplace(df):
    df.drop('y',axis=1,inplace=True)    

def changecell(df):
    df['y'][0] = 99


x = pd.DataFrame({'x': [1,2],'y': [20,31]})

x
Out[204]: 
   x   y
0  1  20
1  2  31

dropdf_copy(x)

x
Out[206]: 
   x   y
0  1  20
1  2  31

changecell(x)

x
Out[208]: 
   x   y
0  1  99
1  2  31

在上面的例子中,dropdf() 没有修改原始数据帧 x,而 changecell() 修改了 x。我知道如果我对 changecell() 添加小改动,它不会改变 x。

def changecell(df):
    df = df.copy()
    df['y'][0] = 99

我认为在我编写的每个函数中都包含 df = df.copy() 并不是很优雅。

问题

1) pandas 什么情况下会改变原始数据帧,什么时候不会?有人能给我一个明确的通用规则吗?我知道这可能与可变性和不变性有关,但在 Whosebug 中没有明确解释。

2) numpy 的行为是相同的还是不同的?其他 python 个对象呢?

PS: 我在 Whosebug 上做了研究,但找不到一个明确的通用规则来解决这个问题。

没有什么可处理的 pandas。这是可变值上 local/global 个变量的问题。在 dropdf 中,您将 df 设置为局部变量。

与列表相同:

def global_(l):
    l[0]=1

def local_(l):
    l=l+[0]  

在第二个函数中,如果你这样写也是一样的:

def local_(l):
    l2=l+[0]

所以你不会影响 l

这里python tutor exemple哪双鞋怎么回事。

默认情况下 python 确实通过引用传递。仅当在函数中进行显式复制(如赋值)或使用 copy() 函数时,传递的原始对象才不变。

带有显式副本的示例:

#1. Assignment 
def dropdf_copy1(df):

    df = df.drop('y',axis=1)
#2. copy()
def dropdf_copy2(df):
    df = df.copy() 
    df.drop('y',axis=1,inplace = True)

如果未完成显式复制,则会更改传递的原始对象。

def dropdf_inplace(df):
    df.drop('y',axis=1,inplace = True)