4

ローカル変数を操作する関数があり、関数の完了後に最終変数を返します。関数の前にこの変数が何であったかを記録したいのですが、グローバル変数はローカル変数とともに更新されます。これが私のコードの短縮版です(かなり長いです)

def Turn(P,Llocal,T,oflag):
    #The function here changes P, Llocal and T then passes those values back
    return(P, Llocal, T, oflag)

#Later I call the function
#P and L are defined here, then I copy them to other variables to save
#the initial values

P=Pinitial
L=Linitial
P,L,T,oflag = Turn(P,L,T,oflag)

私の問題は、Llocal が更新されたときに L と Linitial の両方が正確に更新されることですが、Linitial を変更しないでください。P は変わらないので、ここで何が起こっているのか混乱しています。ヘルプ?ありがとう!

勇敢な人々のためのコード全体はこちら: https://docs.google.com/document/d/1e6VJnZgVqlYGgYb6X0cCIF-7-npShM7RXL9nXd_pT-o/edit

4

3 に答える 3

2

問題は、PとLがnames、値自体ではなく、でboundあるということです。objectsそれらをパラメーターとして関数に渡すと、実際にはバインディングのコピーがPとLに渡されます。つまり、PとLが可変オブジェクトの場合、それらに加えられた変更は関数呼び出しの外部に表示されます。 。

コピーモジュールを使用して、名前の値のコピーを保存できます。

于 2012-12-26T21:30:18.543 に答える
1

リストは可変です。リストを関数に渡し、その関数がリストを変更する場合、同じリストにバインドされている他の名前からの変更を確認できます。

問題を解決するには、次の行を変更してみてください。

L = Linitial

これに:

L = Linitial[:]

このスライスは、リストの浅いコピーを作成します。保存されているリストに項目を追加または削除しても、リストLは変更されませんLintial

ディープ コピーを作成する場合は、 を使用しますcopy.deepcopy


P整数なので同じことは起こりません。整数は不変です。

于 2012-12-26T21:33:38.660 に答える
0

Python では、変数はメモリ内のオブジェクトまたは値への単なる参照です。たとえば、リストがある場合x:

x = [1, 2, 3]

したがって、別の変数に代入するとき、xそれを と呼びましょう。 (リスト)によって参照されるオブジェクトへのy新しい参照 ( ) を作成するだけです。yx[1, 2, 3]

y = x

更新するxと、実際には が指すオブジェクトx、つまりリストが更新されます[1, 2, 3]。同じ値を参照しているためy、それも更新されているように見えます。

変数はオブジェクトへの参照にすぎないことに注意してください。

本当にリストをコピーしたい場合は、次のようにする必要があります。

new_list = old_list[:]

ここに良い説明があります:http://henry.precheur.org/python/copy_list

于 2012-12-26T21:35:50.263 に答える