2017-03-15 11 views
0
import pandas as pd 
import numpy as np 
def my_fun(x): 
    x[x>2] = 2 
    y = 2 * x 
    return y 
sigma = pd.Series(np.linspace(0, 3, 80)) 
print(sigma.max()) # 3 
my_fun(sigma) 
print(sigma.max()) # 2 

ここで問題は、変更可能なオブジェクトsigmaのコピーがシグマ自体に影響するローカル環境内で変更されることです。変更可能なオブジェクトシグマを変更することを避けるために、エレガントにmy_funを書き直すには? my_funの入出力は、同じタイプでなければなりません。オブジェクトの変更可能性:ローカル環境内のオブジェクトのコピーを変更すると、グローバル環境に影響します

答えて

0

実際のオブジェクトのハンドルではなく、オブジェクトのコピーへのハンドルを関数に渡すことができます。

my_fun(sigma.copy()) 

編集:コピーを渡すことを忘れた場合は、コピーを機能に移動することができます。しかし、オブジェクトxに.copy()関数があると仮定する必要があります。

def my_fun(x_original): 
    x = x_original.copy() 
    x[x>2] = 2 
    y = 2 * x 
    return y 
+0

、my_funは静かに地球環境を変更することになります。したがって、私はこのアプローチをエレガントなものにするとは思わない。 – MLguy

0

ここでは3つの操作を行っています。

a = x > 2 
x[a] = 2 
b = x * 2 
  • 最初は、ブール値の新しいリストを作成します。これは配列を変更するのではなく、代わりに新しいオブジェクトで新しいリストを作成します。つまり、sigma.max()に電話すると、Trueが得られません。

  • 次に、2行目がxに変異します。新しい配列が戻ってこない場合は、データを突然変異させています。

  • 3行目では、リスト内の各項目が倍増する新しいリストを作成します。

したがって、新しいリストを作成してからデータを変更したいとします。これを行うには、3番目の操作を最初に実行します。 だから、あなたが本当にしたい:ユーザーが.copy()オブジェクトを提供するのを忘れた場合は

def my_fun(x): 
    b = 2*x 
    b[b>4] = 4 
    return b 
+0

あなたのアプローチはこの特定のケースで動作しますが、最初の操作b = 2 * xを実行できると仮定し、b = 2 * np.log(x)の場合はそうではないかもしれません。したがって、最初にxに操作を適用する必要があります。私はupvotedしましたが、私は答えを受け入れる前に少し待つつもりです。 – MLguy

関連する問題