2017-03-08 9 views
1

奇妙なことが、私はこのようなことを行うときに、今日たまたま:のpython通過

a = np.array([1, 2, 3]) 

b = a 

b[0] = 0 

print a, b 

そして値が参照渡しているようです!答えは次のようになります。

result: [0 2 3] [0 2 3] 

しかし、通常、私はPythonで変数を次のように、値によって渡されると思う:

a = np.array([1, 2, 3]) 

b = a 

b = np.array([0, 2, 3]) 

print a, b 

そして答えは次のようになります。

result: [1 2 3] [0 2 3] 

しかし、なぜですそれは起こっている?変数が参照または値を渡すかどうかを決定するにはどうすればよいですか?何人かは、変更可能なオブジェクトのためだと言ったが、まだそれほど得られていない。それで私のために説明できますか?どうもありがとう!それがnumpyのを行うには直接何も持っていないので

+0

あなたには何が奇妙ですか? – Vallentin

+0

[参照によって変数を渡すにはどうすればいいですか?](http://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference) – TemporalWolf

+0

割り当て** never * *はPythonでコピーを作成します。それは常にそれがどのように機能するかです。あなたの2番目の例は、あなたの最初のものとまったく同じ* *働いています。 –

答えて

3

、のように書き換えてみましょう:

a = [1, 2, 3] 

b = a 

b = [0, 2, 3] 

print a, b 

重要なのは、名前と値が別々のものであるということです。だから、最初の行に:

a = [1, 2, 3] 

あなたは、リストを作成し、aあなたがbaを割り当てる次の行に今

に割り当てます。依然として1つのリストしか存在せず、両方の名前が単にそれを参照しています。

次は新しいリストを作成し、bに割り当てます。今すぐb古いリストの代わりに新しいリストを参照します。今度は、2つの名前の代わりに、1つの名前(a)だけが他のリストを参照します。

我々はあなたが最初の例、取る場合このように:あり

b[0] = 0 

abの両方は、このように変更が両方として、両方の名前から観察することができ、同じリストを参照名前は同じリストを参照します。

1

Pythonでの変数代入は、常に参照への代入です。言い換えれば、Pythonでは、変数は名前であり、変数を割り当てることは何かの名前を宣言しています。

a = np.array([1, 2, 3]) 

b = a 

b[0] = 0 

print a, b 

これはbaの名前も聞かせて、その後、aは、その最初の配列の名前も聞かせて意味するが、aので、本当に私達はちょうどbもの名前も聞かせて言っている、最初の配列を意味し、最初の配列。次にb[0] = 0は、配列の最初の要素を変更することを意味します。abを印刷すると、abは同じものの名前なので、同じものを2回(アレイ)印刷しています。

a = np.array([1, 2, 3]) 

b = a 

b = np.array([0, 2, 3]) 

print a, b 

最初の2行は前回と同じです。 aは配列の名前で、bです。次にb = np.array([0, 2, 3])は、bがこの新しい配列の名前になったことを意味します。したがって、abを印刷すると、最初の配列の名前であるaと、2番目の配列の名前であるbが印刷されます。

関連する問題