関数が呼び出されるたびにPython関数のデフォルト値を評価するにはどうすればよいですか? 次のダミー コードを使用します。
b=0
def a():
global b
return b
def c(d=a()):
return d
私が出力として期待するもの:
>>> c()
0
>>> b=1
>>> a()
1
>>> c()
1
私が実際に得るもの:
>>> c()
0
>>> b=1
>>> a()
1
>>> c()
0
あなたの元の答えによく似たもう1つの解決策。
b = 0
def a():
return b
def c(d=a): # When it's a parameter, the call will be evaluated and its return
# value will be used. Instead, just use the function name, because
return d() # within the scope of the function, the call will be evaluated every time.
のように、関数名が括弧とそのパラメーターとペアになっている場合、f(x)
その時点で関数を呼び出すことを意図していると見なされます。
d=a() は、関数 c が定義されているときにプログラムの開始時に評価されます (つまり、 a() は 0 を返す間に呼び出されます ...)
def c(d=None):
if d == None: d=a()
return d
必要なときに評価されます
ここでの問題は、おそらく既にご存じのとおり、d=a()
(デフォルトの引数代入) が関数の定義時に評価されることです。
それを変更するには、たとえば次のように使用するのがかなり一般的です。None
デフォルトの引数として、関数の本体で評価します。
b=0
def a():
global b
return b
def c(d=None):
if d is None:
d = a()
return d
上記を少し変更します。
b = 0
def a():
# unless you are writing changes to b, you do not have to make it a global
return b
def c(d=None, get_d=a):
if d is None:
d = get_d()
return d