2017-12-29 27 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が言ったことを少し広げて、パンダについて何も知らないうちに、 'Add_a_column'関数に渡す前に' df_full'をコピーする必要があると思いますか? (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も同じオブジェクトを参照しています。 1つの変数でそのオブジェクトを変更すると、そのオブジェクトに他の変数でアクセスすると変更が表示されます。

関連する問題