2016-05-17 9 views
0

Pythonのオプションの引数の動作を関数で記述できますか?関数内のPython 3.5のオプションの引数

私の理解では、オプションの引数は関数定義のデフォルト値を使用していました。

次のコードは正しい動作をしています。

# Function 
def testf2(val=0): 
    val += 5 
    print(val) 
    val=0 
    return 

# Testing 
testf2() 
testf2(10) 
testf2() 

# Output: 
5 
15 
5 

しかし、オプションのリストを使用した同様のコードでは、まったく異なる動作がなぜ発生するのかわかりません。この関数は、リストがval = []によってクリアされても、いくつかのデータを記憶します。

# Function 
def testf(val=[]): 
    val.append("OK") 
    print(val) 
    val=[] 
    return 

# Testing 
testf() 
testf(["myString"]) 
testf() 
testf(["mySecondString"]) 
testf() 


# Output: 
['OK']      #excpected ['OK'] 
['myString', 'OK']   #excpected ['myString'] 
['OK', 'OK']    #excpected ['OK'] 
['mySecondString', 'OK'] #excpected ['mySecondString'] 
['OK', 'OK', 'OK']   #excpected ['OK'] 

ご協力いただきありがとうございます。

答えて

1

Pythonのデフォルト引数は、関数が定義されているときに一度だけ評価され、関数が呼び出されるたびに評価されることはありません。つまり、変更可能なデフォルトの引数を使用してそれを変更すると、その関数への今後のすべての呼び出しに対してそのオブジェクトを変更してしまいます。

The Hitchhiker's Guide to Python: Common Gotchas

関連する問題