2017-12-29 43 views
2

함수 호출로 가변 범위를 이해하려고합니다.가변 범위 (함수 포함)

토론 할 코드.

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의 로컬 항목입니다. 옳은? 내가 코드를 실행하면

, 열이의 함수에 의해 수정되는 내가 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 추가를 얻을?

+3

* name *'df'는 함수에 국한되지만'df'와'df_full'은 * 같은 * 객체를 참조합니다. –

+0

은 함수에서 df_full을 복제하고 새 객체를 조작 한 다음 다시 보내려는 것처럼 들립니다. – Fallenreaper

+0

@DanielRoseman이 말한 바를 조금 늘리고 Pandas에 대해 전혀 몰라도'df_full'을'Add_a_column' 함수에 전달하기 전에 복사해야한다고 생각합니다. (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.copy.html 참조) 여기서 왜 이런 일이 발생하는지 읽어보십시오. https://stackoverflow.com/q/2612802/289011 – BorrajaX

답변

1

df_full의 참조가 함수로 전달됩니다. 따라서 dfdf_full은 동일한 개체입니다. 즉, 둘 모두 수정되면 수정됩니다. 당신은 Add_a_column(df.copy())

0
  • df_full 글로벌처럼 복사 된 기능 함수를 호출 할 수있다, 또는

    def Add_a_column(df): 
        df = df.copy() 
        df['Col2']= np.sign(np.random.randn(len(df))) 
        return df 
    

    :

    당신은 당신의 기능을 변경해야합니다. 옳은?

  • df_another는 전역입니다. 옳은?
  • df는 Add_a_column의 로컬 항목입니다. 옳은?

범위를 잘 알고있는 것 같습니다. 각 변수에는 사용자가 설명하는 범위가 있습니다.

누락 된 부분은 df_fulldf가 너무 똑같은 개체를 나타냅니다. 하나의 변수로 해당 오브젝트를 변경하면 다른 변수로 해당 오브젝트에 액세스 할 때 변경 사항이 표시됩니다.