2017-04-18 6 views
0

これはPythonである呼び出されたときに上に運びます。変数関数が複数回

だから、私は一種の機能を定義しています

その後
def function(var1, var2 = [[], 0]): 
    # some code that changes both var1 and var2 
    return (var2, var1) 

、私はループのために作ら:

for x in range(10): 
    print(function(x)) 

私は、関数の内部var2にカップルの変更を行います。私が抱えている問題は、var2の内部で起こった変更が、xを含むforループの各次の繰り返しに対して引き継ぐことです。なぜそれがそうするのか分かりません。私が修正した方法は、代わりに、これを呼んでいる:

for x in range(10): 
    print(function(x, [[], 0])) 

は、しかし、私は(ある[[], 0] VAR2たびに指定する)これを実行する必要がありますする必要はありません。それが役立つ可能性がある場合

また、関数が再帰的です。それはうまく動作し、ちょうどvar2が引き継ぎます。私が起こっためにこれを防ぐにはどうすればよい

?私が起こっためにこれを防ぐにはどうすればよい

+0

デフォルトの可変引数var2 = [[]、0] 'があります。デフォルトは一度だけインスタンス化されます。チャンスがあれば、それは次のコールでも変更されます。安全であるためには、タプルのような変更不可能なデフォルト値を使用してください。 –

+0

適切なコードを示してください。関数内でvar2に対して行った変更 –

+0

リストをインプレースで変更して返します。通常は、どちらか一方が行います。この機能には突然変異が必須であるか? – tdelaney

答えて

0

Pythonは、コードを最初にコンパイルされたときに一度、関数のデフォルトパラメータを作成し、デフォルトが必要とされるたびに、そのオブジェクトを使用しています。 1つの結果として、パラメータが変更可能な場合(リストのように)、その変更は今後のすべての呼び出しで見られます。一つの解決策は

動的

def function(var1, var2=None): 
    if var2 is None: 
     var2 = [[], 0] 
    # some code that changes both var1 and var2 
    return (var2, var1) 
別のオプションをデフォルトとして別の値を使用して、デフォルトを作成するためにそれを使用することである場所にリストを変異中止、代わりにコピーを返すことです。

from copy import deepcopy 

def function(var1, var2=[[], 0]): 
    var1 = deepcopy(var1) 
    var2 = deepcopy(var2) 
    # some code that changes both var1 and var2 
    return (var2, var1) 
0

listvar2=((), 0)の代わりにtupleを使用してください。

説明:デフォルトの引数として指定var2listが一度保存され、あなたがVAR2など、さまざまな引数を指定しない限り、関数は、呼び出されるたびにフェッチされます。したがって、そのリストが変更されたときには、次にそれがフェッチされるときに、その変更が反映されます。 tuple不変であるため、デフォルトの引数としてlistを使用して、代わりに悪い習慣の使用tupleである理由です。

+0

これは問題を 'TypeError: 'tuple'オブジェクトに変更してアイテム割り当てをサポートしていませんが、問題を完全に取り除くことはありません。 – tdelaney