-1

変数を名前で関数に入れたいという問題があります。

私はこれまでにこれを試しました:

x = 5
def func(y = x):
    return y ** 2

>>>print func()
25
>>>x = 4
>>>print func()
25

ただし、コードを入力した後にその入力変数を編集しようとすると、関数は古い入力を検出するため、新しい入力の2乗とは対照的に25が出力されます。

実際に機能する関数に変数をプルするよりクリーンな方法はありますか?

4

5 に答える 5

0

デフォルトの関数値は関数の作成時に計算されるため、その値を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
于 2013-11-02T14:55:43.987 に答える
0

引数のデフォルト値として使用する代わりに、グローバル変数を直接参照するだけです。

def func():
    return x ** 2
于 2013-11-02T14:56:49.900 に答える
0

y のデフォルト値は、関数の実行時ではなく、関数の定義時に設定されます。したがって、デフォルト値はオンラインyの値に設定されます。xdef

これはうまくいくはずです:

def func(y=None):
    if y is None:
        y = x
    return y ** 2
于 2013-11-02T14:57:33.607 に答える
0

一般に、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()
于 2013-11-02T15:07:17.987 に答える