带功能的可变范围

时间:2017-12-29 19:18:33

标签: python scope

尝试通过函数调用来理解变量范围。

要讨论的代码。

import numpy as np
import pandas as pd

# Function to add a column with random stuff to a dataframe 
def Add_a_column(df):
    df['Col2']= np.sign(np.random.randn(len(df)))
    return df

# Create a dataframe with random stuff
df_full = pd.DataFrame(data=np.sign(np.random.randn(5)), columns=['Col1'])

df_another = Add_a_column(df_full)
  • df_full是全球性的。正确的吗?
  • df_another是全球性的。正确的吗?
  • df是Add_a_column的本地。正确的吗?

当我执行代码时,列get被添加到df_full

In[8]: df_full
Out[8]: 
   Col1  Col2
0  -1.0  -1.0
1   1.0  -1.0
2  -1.0   1.0
3   1.0   1.0
4   1.0   1.0

如何避免函数修改df_full?

2 个答案:

答案 0 :(得分:1)

translationField()的引用传递给函数。因此df_fulldf是同一个对象,这意味着它们在修改后都会被修改。

您需要将功能更改为:

df_full

或者,您可以使用复制的函数def Add_a_column(df): df = df.copy() df['Col2']= np.sign(np.random.randn(len(df))) return df

调用该函数

答案 1 :(得分:0)

  
      
  • df_full是全球性的。正确的吗?
  •   
  • df_another是全球性的。正确的吗?
  •   
  • df是Add_a_column的本地。正确的吗?
  •   

听起来你理解范围很好。每个变量都有您描述的范围。

您遗失的部分是df_fulldf也指的是同一个对象。使用一个变量对该对象进行更改时,使用另一个变量访问该对象时,更改是可见的。