【发布时间】:2017-02-08 13:30:15
【问题描述】:
我的问题是关于 pandas DataFrame 在通过引用传递时的不变性。考虑以下代码:
import pandas as pd
def foo(df1, df2):
df1['B'] = 1
df1 = df1.join(df2['C'], how='inner')
return()
def main(argv = None):
# Create DataFrames.
df1 = pd.DataFrame(range(0,10,2), columns=['A'])
df2 = pd.DataFrame(range(1,11,2), columns=['C'])
foo(df1, df2) # Pass df1 and df2 by reference.
print df1
return(0)
if __name__ == '__main__':
status = main()
sys.exit(status)
输出是
A B
0 0 1
1 2 1
2 4 1
3 6 1
4 8 1
而不是
A B C
0 0 1 1
1 2 1 3
2 4 1 5
3 6 1 7
4 8 1 9
其实如果foo被定义为
def foo(df1, df2):
df1 = df1.join(df2['C'], how='inner')
df1['B'] = 1
return()
(即另一个语句之前的“join”语句)那么输出就是
A
0 0
1 2
2 4
3 6
4 8
我很好奇为什么会这样。任何见解将不胜感激。
【问题讨论】:
-
顺便说一句,return 不是函数,它只是一个语句,所以你不需要它后面的括号。
-
This 是我所知道的关于 Python 名称如何工作的最佳讨论。一旦你理解了这一点,你就会理解这种行为。
-
感谢@chthonicdaemon!
标签: python pandas dataframe pass-by-reference immutability