2017-06-30 18 views
2
def swap(array, i): 
     array[i], array[(i+1)%len(array)] = array[(i+1)%len(array)], array[i] 
     return array 

なぜ私のスワップ機能がスワップするのですか? 私はスワップ関数 'array'はローカル変数であり、ローカル変数の要素を入れ替えて 'array'を返すと、なぜリストに変更が加えられたのですか? たとえば、リストa = [1,2,3,4]を呼び出した後にswap(a,0)を呼び出すと、[2,1,3,4]が返されますが、リスト 'a'が変更されています。私のスワップ機能の交換がなぜ適切なのですか?

+1

リストが変更可能であるためです。 'array'をリストとして渡して、スワップを実行して、その場で変更します。 – Wondercricket

+0

[参照によって変数を渡す方法は?](https://stackoverflow.com/questions/986006/how- do-i-pass-a-reference-by-reference)(問題の完全な説明については、受け入れられた回答を参照してください) – jadsq

+0

リストはメモリロケーションへのポインタです。コピー操作を実行する必要があります。または、関数スペースに関係なく、同じメモリチャンクで動作します。list_copy = original_list [:] – Sebastian

答えて

1

多くのオブジェクト指向言語と同様に、Pythonはコピーではなくを共有して関数の引数を渡します。

メモリの特定のビットには、arrayというラベルを付けてください。関数def f(a)aという変数を受け取った場合、​​を呼び出すたびにsome_variableを格納するメモリは、関数で利用可能になります。

これは、この例では変数が変更された理由です。 arrayの元の値を変更しない場合は、まず下のコードのようにコピーする必要があります。

def swap(original_array, i): 
    # use list() return a copy of the list 
    new_array = list(original_array) 
    # do work on the copy of the list, which is a local var 
    new_array[i], new_array[(i+1)%len(new_array)] = new_array[(i+1)%len(new_array)], new_array[i] 
    # return the value of the local var 
    return new_array 

# setup a list 
a = [1,2,3,4] 
# function still works 
assert swap(a, 2) == [1,2,4,3] 
# but it does not change the value passed to it 
assert a = [1,2,3,4] 
# and its local variable new_array is not available in this scope 
assert 'new_array' not in dir() 
関連する問題