変数を名前で関数に入れたいという問題があります。
私はこれまでにこれを試しました:
x = 5
def func(y = x):
return y ** 2
>>>print func()
25
>>>x = 4
>>>print func()
25
ただし、コードを入力した後にその入力変数を編集しようとすると、関数は古い入力を検出するため、新しい入力の2乗とは対照的に25が出力されます。
実際に機能する関数に変数をプルするよりクリーンな方法はありますか?
デフォルトの関数値は関数の作成時に計算されるため、その値をx
変更しても関数内で変更されることはありません。
ドキュメントから:
デフォルトのパラメータ値は、関数定義の実行時に評価されます。これは、関数が定義されるときに式が一度評価され、同じ「事前に計算された」値が各呼び出しに使用されることを意味します。
読む:mutable
オブジェクトをデフォルト値として使用すると、予期しない結果が生じる可能性があります。
グローバル値にアクセスしたい場合は、次のようにします。
def func():
return x**2
または、明示的に渡すことをお勧めします。
def func(y):
return y**2
function 内でグローバル変数を使用しないもう 1 つの理由:
>>> x = 10
>>> def func():
... print x
... x = 5
...
>>> func()
Traceback (most recent call last):
func()
File "<ipython-input-5-ab38e6cadf6b>", line 2, in func
print x
UnboundLocalError: local variable 'x' referenced before assignment
使用classes
:
class A:
x = 5
@staticmethod
def func():
return A.x**2
...
>>> A.func()
25
>>> A.x = 10
>>> A.func()
100
引数のデフォルト値として使用する代わりに、グローバル変数を直接参照するだけです。
def func():
return x ** 2
y のデフォルト値は、関数の実行時ではなく、関数の定義時に設定されます。したがって、デフォルト値はオンラインy
の値に設定されます。x
def
これはうまくいくはずです:
def func(y=None):
if y is None:
y = x
return y ** 2
一般に、python キーワード引数には常に値が割り当てられ、その割り当てられた値を変更することはできません。だからあなたのコードで
x=5
def func(y = x):
return y ** 2
print func()
x=4
print func()
キーワード引数 y には x の値、すなわち 5 が割り当てられ、その値を変更することはできません。したがって、x の値を変更しても、25 と同じ出力が得られます。
これを解決するために、関数はグローバル変数に直接アクセスし、以下のコードのような値を返します。
x=5
def func():
return x ** 2
print func()
x=4
print func()