フィボナッチ関数の再帰を高速化するために、変数オブジェクトが Python 関数のパラメータのデフォルト値に渡されているのを見ました。コードは次のとおりです:
def fib(n, cache={0: 0, 1: 1}): if n not in cache: cache[n] = fib(n - 1) + fib(n - 2) return cache[n]
おかしくないですか?これができるということですか? 速度は本当に非常に速く、実行結果は次のとおりです:
## ただし、これは行わないことをお勧めします。 これは、すべてがオブジェクトであり、Python 関数もオブジェクトであるためです。パラメータのデフォルト値は、次の属性です。オブジェクト。パラメータのデフォルト値はコンパイル段階ですでに関数にバインドされています。変数オブジェクトの場合、Python 関数パラメータのデフォルト値は保存され、すべての呼び出し元で共有されます。つまり、関数パラメータのデフォルト値は、List や Dict などの変数オブジェクトであり、呼び出し元 A がそれを変更しました。その後、呼び出し元 B は、呼び出し時に A の変更結果を見ることになります。このようなモードでは、上記の fib アルゴリズムなど、予期しない結果が生じることがよくあります。しかし、それらのほとんどはバグです。 次の簡単なコードを見てみましょう:def func(n, li = []): for i in range(n): li.append(i) print(l) func(2) # [0,1] func(3,l=[1,2]) # [1,2,0,1,2] func(2) # [0,1]
[0, 1] [1, 2, 0, 1, 2] [0, 1, 0, 1]
def func(n, li = []): print(id(li)) for i in range(n): li.append(i) print(li) func(2) func(3,li=[1,2]) func(2)
140670243756736 [0, 1] 140670265684928 [1, 2, 0, 1, 2] 140670243756736 [0, 1, 0, 1]
def generate_new_list_with(my_list=None, element=None): if my_list is None: my_list = [] my_list.append(element) return my_list
以上がPython関数のパラメータのデフォルト値が可変オブジェクトの場合は注意が必要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。