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

时间:2016-06-15 21:47:41

标签: python pandas global local

为什么下面的函数会更改名为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')

1 个答案:

答案 0 :(得分:4)

来自docs

  

数据的可变性和复制

     

所有pandas数据结构都是值可变的(它们包含的值可以更改)但并非总是如此   大小可变的。系列的长度不能改变,但是,为   例如,可以将列插入到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

df2是对df

的引用
In [28]: id(df) == id(df2)
Out[28]: True

你的功能,不会改变参数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