2011-01-17 4 views
1

私のプログラムに問題が発生しました。ここでは、メソッド内で使用されているすべてのものが、使用されているパラメータ変数に保存されています。メソッドは、変数を元のパラメータ変数に戻します。

ここでは、リストの要素を所定のスペースだけ左に移動するメソッドの例を示します。

def moveLeft (perm, pos, spaces): 
    permTemp = perm 
    for n in range(spaces): 
     charMoved = permTemp[pos-n] 
     permTemp [pos-n] = permTemp[pos-n-1] 
     permTemp[pos-n-1] = charMoved 
    return permTemp 

permO = [0,1,2,3] #original perm 
print moveLeft(permO, -1, 2) 
print moveLeft(permO, -1, 2) 
print permO 

出力は次のようになり期待:(それはメソッドの同じ戻り値を印刷されているので)最初の二つは同じで、かつ最後の出力は、元のリストであること([0,1,2、 3])。 は、代わりに私が取得:

>>> 
[0, 3, 1, 2] 
[0, 2, 3, 1] 
[0, 2, 3, 1] 

答えて

2

使用

permTemp = perm[:] 

実際にだけではなく、同じオブジェクトに新しい名前を割り当てるので、リストをコピーします。

Pythonの割り当てでは新しいオブジェクトは作成されません。既存のオブジェクトに名前を付けるだけです。そのため、元のリストを変更しています。

+0

素晴らしいことだ。つまり、今多くの意味があります!これは前にこの問題を経験したことがないので、Javaで何が起こるかは異なるはずです。 –

+0

いいえ、Javaは同じことを行います。オブジェクトへの参照も使用するので、 'int [] arr = {1,2,3}; int [] arr2 = arr; arr2 [1] = -2; 'は元の配列を変更します。実際のコピーを作成する 'System.arrayCopy()'メソッドがあります。 – dimo414

1

使用スヴェンのリストのコピーが、あなたが値を交換するために一時変数を必要としないことにも注意してください:

def moveLeft(perm, pos, spaces): 
    permTemp = perm[:] 
    for n in range(spaces): 
     permTemp[pos-n], permTemp[pos-n-1] = permTemp[pos-n-1], permTemp[pos-n] 
    return permTemp 
+0

ありがとうございます、それは多くの時間を節約します! –

関連する問題