2016-08-26 9 views
6

は次に例を示します。Python:2つの変数がメモリ内の同じオブジェクトを指しているのはいつですか?

l = [1, 5, 9, 3] 
h = l 

h[0], h[2] = h[2], h[0] 

print(h) # [9, 5, 1, 3] 
print(l) # [9, 5, 1, 3] 

h = h*2 
print(h) # [9, 5, 1, 3, 9, 5, 1, 3] 
print(l) # [9, 5, 1, 3] 

私の理解で呼び出すh = lを設定すると、単にlがで指していたことをメモリ内の同じ項目でhを指すことでした。だから、最後の3行で、hlは同じ結果を得られないのはなぜですか?

+1

再度 'h 'に割り当てるときに' h'が指すものを変更します。 – user2357112

+0

変数の値が可変であるかどうかによって異なります。リストは変更可能ですが、整数は変更できません。 –

+0

'h = l'を設定すると、' l'に 'h'をポイントします。しかし、 'h = h * 2'を' h'とすると、 – BrenBarn

答えて

2

hは、lと同じ項目を指しています。しかし、それは永久に2つを溶接しません。 hh = h * 2に変更すると、メモリ内の別の場所に倍精度バージョンを作成してから、hを2倍にするように指示します。あなたは変更する指示を与えていませんl;それでも元のアイテムを指しています。

7

この簡単なテストの実行、チェックするために非常に簡単です:これはなぜあなたが原因でラインh = h * 2の、時間のidが

を変更されている見ることができるように

l = [1, 5, 9, 3] 
h = l 

h[0], h[2] = h[2], h[0] 

print(h) # [9, 5, 1, 3] 
print(l) # [9, 5, 1, 3] 

print id(h), id(l) 
h = h * 2 
print id(h), id(l) 

print(h) # [9, 5, 1, 3, 9, 5, 1, 3] 
print(l) # [9, 5, 1, 3] 

を? *演算子を使用しているときは、新しいリスト(新しいメモリ空間)を作成します。あなたのケースでは、この新しいリストは古いh参照に割り当てられています。そのため、IDが異なることがわかりますh = h * 2

詳細については、Data Modelのリンクを参照してください。

+0

はい、これは私には言えませんなぜ* – AlanH

+0

@AlanH Ok、私は答えを編集しました – BPL

1

変数に割り当てるときはいつでも、そのID(メモリアドレス)は一般的に変更されます。変更されなかった唯一の理由は、それがすでに保持していた値に割り当てられたということだけです。したがって、あなたのステートメントh = h * 2は、hが以前のhの値に基づいて起こった全く新しいオブジェクトになりましたが、それは実際にそのアイデンティティーには関係ありません。

4

h = h * 2は、新しいリストオブジェクトにhを割り当てます。

あなたは、おそらくその場でhを変更したい:

h *= 2 
print(h) # [9, 5, 1, 3, 9, 5, 1, 3] 
print(l) # [9, 5, 1, 3, 9, 5, 1, 3] 
+0

短くて甘い... +1 'h + = h * 2'もうまくいくでしょう。 :) –

+0

@ l'L'lそれはうまくいくが、倍ではなく3倍になるだろうか?あなたは 'h + = h'を意味しましたか? –

+1

訂正してくれてありがとう、それは私が意味していたものです、私の電話は何とか* 2をそこに残しました。 –

1

それは難しいですが、あなたがリストを掛けたとき、あなたは新しいリストを作成しています。

'l'と 'h'は、メモリ内の同じリストを参照しています。

h[0], h[2] = h[2], h[0] 

print(h) # [9, 5, 1, 3] 
print(l) # [9, 5, 1, 3] 

あなたはhの値を入れ替え、その値がlに変更されています。あなたがそれら同じオブジェクト

h = h * 2 

print(h) # [9, 5, 1, 3, 9, 5, 1, 3] 
print(l) # [9, 5, 1, 3] 

用として別の名前h * 2を乗算すると、あなたが今だけlは、元のリストオブジェクトになり、新しいリストを作成している考えるとき、これは理にかなっています。

>>> l = [1, 5, 9, 3] 
>>> h = l 
>>> id(h) == id(l) 
True 
>>> id(h) 
139753623282464 
>>> h = h * 2 
>>> id(h) == id(l) 
False 
>>> id(h) 
139753624022264 

乗算した後どのようにidhの変更を参照してください?現在のリストを変更するappend()のように、*演算子は他のリスト演算とは異なり、新しいリストを作成します。

>>> h.append(1000) 
>>> id(h) 
139753623282464 # same as above! 

関連する問題