为什么函数内的这个 DataFrame 修改会改变全局外函数?

Mic*_*ael 5 python global local pandas

为什么下面的函数会改变全局DataFrame命名df?它不应该只更改df函数内的局部变量,而不是全局变量df吗?

import pandas as pd

df = pd.DataFrame()

def adding_var_inside_function(df):
    df['value'] = 0

print(df.columns) # Index([], dtype='object')
adding_var_inside_function(df)
print(df.columns) # Index([u'value'], dtype='object')
Run Code Online (Sandbox Code Playgroud)

Max*_*axU 8

来自文档

数据的可变性和复制

所有 Pandas 数据结构都是值可变的(它们包含的值可以改变)但并不总是大小可变的。Series 的长度无法更改,但是,例如,可以将列插入到 DataFrame 中。但是,绝大多数方法都会生成新对象并保持输入数据不变。不过,总的来说,我们喜欢在合理的情况下支持不变性

这是另一个示例,显示值(单元格)的可变性:

In [21]: df
Out[21]:
   a  b  c
0  3  2  0
1  3  3  1
2  4  0  0
3  2  3  2
4  0  4  4

In [22]: df2 = df

In [23]: df2.loc[0, 'a'] = 100

In [24]: df
Out[24]:
     a  b  c
0  100  2  0
1    3  3  1
2    4  0  0
3    2  3  2
4    0  4  4
Run Code Online (Sandbox Code Playgroud)

df2 是参考 df

In [28]: id(df) == id(df2)
Out[28]: True
Run Code Online (Sandbox Code Playgroud)

您的函数不会改变参数 DF:

def adding_var_inside_function(df):
    df = df.copy()
    df['value'] = 0
    return df

In [30]: df
Out[30]:
     a  b  c
0  100  2  0
1    3  3  1
2    4  0  0
3    2  3  2
4    0  4  4

In [31]: adding_var_inside_function(df)
Out[31]:
     a  b  c  value
0  100  2  0      0
1    3  3  1      0
2    4  0  0      0
3    2  3  2      0
4    0  4  4      0

In [32]: df
Out[32]:
     a  b  c
0  100  2  0
1    3  3  1
2    4  0  0
3    2  3  2
4    0  4  4
Run Code Online (Sandbox Code Playgroud)