2

関数が呼び出されるたびに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
4

4 に答える 4

3

あなたの元の答えによく似たもう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)その時点で関数を呼び出すことを意図していると見なされます。

于 2012-09-23T23:56:30.520 に答える
1

d=a() は、関数 c が定義されているときにプログラムの開始時に評価されます (つまり、 a() は 0 を返す間に呼び出されます ...)

def c(d=None):
    if d == None: d=a()
    return d

必要なときに評価されます

于 2012-09-23T23:40:40.453 に答える
1

ここでの問題は、おそらく既にご存じのとおり、d=a()(デフォルトの引数代入) が関数の定義時に評価されることです。

それを変更するには、たとえば次のように使用するのがかなり一般的です。Noneデフォルトの引数として、関数の本体で評価します。

b=0
def a():
    global b
    return b

def c(d=None):
    if d is None:
        d = a()
    return d
于 2012-09-23T23:41:18.310 に答える
1

上記を少し変更します。

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
于 2012-09-23T23:53:24.940 に答える