可能性のある複製:
Python:参照によって変数を渡す方法は?
私のコード:
locs = [ [1], [2] ]
for loc in locs:
loc = []
print locs
# prints => [ [1], [2] ]
なぜloc
はlocs
の要素の参照ではないのですか?
Python:明示的にコピーされない限り、すべてが参照として渡されます[これは本当ですか? ]
説明してください.. python決定参照とコピー)
更新:
実行する方法 ?
def compute(ob):
if isinstance(ob,list): return process_list(ob)
if isinstance(ob,dict): return process_dict(ob)
for loc in locs:
loc = compute(loc) # What to change here to make loc a reference of actual locs iteration ?
enumerate
を使いたくないのですが、それなしでも可能ですか?PythonのすべてがJavaで値によって渡され割り当てられるのと同じように、値によって渡され割り当てられます。Pythonのすべての値は参照です(ポインタ)オブジェクトへ。オブジェクトは値にできません。割り当ては常に値(ポインタ)をコピーします。したがって、このような2つのポインタは同じオブジェクトを指すことができます。
あなたの場合、ループのすべての繰り返しは、リストの要素を変数loc
に割り当てます。次に、変数loc
に何か他のものを割り当てます。これらの値はすべてポインターです。ポインターを割り当てています。しかし、いかなるオブジェクトにも影響を与えません。
Effbot(別名Fredrik Lundh)は、Pythonの変数受け渡しスタイルをオブジェクトごとの呼び出しとして説明しています: http://effbot.org/zone/call-by-object.htm
オブジェクトはヒープ上に割り当てられ、それらへのポインターはどこにでも渡すことができます。
x = 1000
_などの割り当てを行うと、現在のネームスペースの文字列「x」を1000を含む整数オブジェクトへのポインターにマップする辞書エントリが作成されます。x = 2000
_で「x」を更新すると、新しい整数オブジェクトが作成され、新しいオブジェクトを指すように辞書が更新されます。古い1000オブジェクトは変更されていません(オブジェクトが他のものを参照しているかどうかによって、生きている場合と生きていない場合があります)。y = x
_などの新しい割り当てを行うと、「x」のエントリと同じオブジェクトを指す新しい辞書エントリ「y」が作成されます。x = []; y = x; x.append(10); print y
は_[10]
_を出力します。空のリストが作成されました。 「x」と「y」の両方が同じリストを指します。 appendメソッドは、リストオブジェクトを変更(更新)し(データベースへのレコードの追加など)、結果は "x"と "yの両方に表示されます。 "(データベースの更新がそのデータベースへのすべての接続から見えるように)。問題が明らかになることを願っています。
Pythonでは、参照または値の観点で考えることは役に立ちません。どちらも正しくありません。
Pythonでは、変数は単なる名前です。 forループでは、loc
はリスト内の現在の要素を指す単なる名前です。 loc = []
単に再バインド名前loc
を別のリストに追加し、元のバージョンをそのままにします。
しかし、あなたの例では、各要素はリストなので、実際にはmutateその要素であり、それは元のリストに反映されます:
for loc in locs:
loc[0] = loc[0] * 2
あなたが言う時
loc = []
loc
変数を新しく作成された空のリストに再バインドしています
おそらくあなたが欲しい
loc[:] = []
Locのスライス(たまたまリスト全体)を空のリストに割り当てます
すべてはオブジェクトによって渡されます。再バインドと変更は異なる操作です。
locs = [ [1], [2] ]
for loc in locs:
del loc[:]
print locs
Locがlocsの要素の参照ではないのはなぜですか?
それは。または、少なくとも、Pythonの他のすべての変数と同じ意味です。 Python変数はストレージではなく名前です。 loc
は[[1,2], [3,4]]
の要素を参照するために使用される名前であり、locs
は構造全体を参照する名前です。
loc = []
これは意味しない "loc
が名前を付けているものを見て、それを[]
に変換する"それは、できないという意味です。なぜなら、Pythonオブジェクトは不可能のようなものだからです。
代わりに、「loc
が現在名前になっているものの名前であるのをやめ、代わりに[]
の名前になり始める」ことを意味します。 (もちろん、それはそこに提供されている特定の[]
を意味します。一般に、メモリ内には同じオブジェクトがいくつか存在する可能性があるためです。)
当然、locs
の内容は結果として変更されません。