0

ここでxを更新しています。xを更新した後にyを印刷すると、yに反射が表示されます。ただし、最初の例では、yはその変化を示していません。これは私が迷子になるところです。誰かが私にこれを説明できますか?

x = 2
y = x + 3
###  printing y will yield 5
x = 8    # ok am I updating the same storage space that x pointed to, or is abandoning it and creating
         # another with a value of 8?
###  printing y will still yield 5 (why is that? if Y always points to x and adds 3 to it?)

in contrast with this:

x = [1,2,3]
y = [x,4,5,6]
x[0] = 50
y[2] = 80
z = y[:] + [100,101,1020
4

7 に答える 7

4

x = 2 値 2 を持つ新しいオブジェクトが作成され、x はそれを参照します

y = x + 3 値が 5 の新しいオブジェクトが作成され、y はそれを参照します。

x = 8値 8 を持つ新しいオブジェクトが作成され、x がそれを参照するようになりました。値 2 のオブジェクトの参照カウントが減分され、ガベージ コレクションの候補になります。

x = [1,2,3] 新しいリスト (「型/クラス リストのオブジェクト」) が作成され、x がそれを参照します。

y = [x,4,5,6] 新しいリスト オブジェクトが作成され、y がそれを参照します。以前に参照されていたオブジェクトxは、基本的になくなりました。それはいわゆる「ガベージ」であり、いわゆる「ガベージコレクター」によって収集される場合があります。

x[0] = 50 x が参照するリストの最初の要素を 50 に変更します

y[2] = 80 y が参照するリストの 3 番目の要素を 80 に変更します

z = y[:] y によって参照される要素のコピーを含む、新しいリスト オブジェクトが作成されます。これは、最初の要素の参照 (x) をコピーしません。それを参照copy.deepcopy()してください。

于 2012-10-12T13:15:04.413 に答える
1

あなたが書いた:

y を印刷しても 5 が得られます (Y が常に x を指し、それに 3 を追加するのであれば、なぜですか?)

あなたの誤解はここから始まります。x を指してyいません。y値は 5 です。セルに数式を含めることができるスプレッドシートのモデルとこれを同一視しようとしているように思えます。コーディングはそうではありません。に何かを割り当てるときyは、式ではなく値を割り当てています。

于 2012-10-12T12:59:19.257 に答える
0
y = x + 3

yの値はすぐに計算されます。それで全部です。

于 2012-10-12T13:21:48.133 に答える
0

ボックスのセットと考えてください。配列ではなく単一の変数について話している場合、X は y と同様にボックスの名前です。したがって、x = 2 は、x というボックスに 2 を入れることを意味します。y = x + 3 は x の箱に入っているものに 3 を足して y の箱に入れるという意味です。x = 8 は、ボックス x の内容を 8 に置き換えることを意味します。y は既に計算されているため、変更できません。

x = [1, 2, 3] のような配列では、x はボックスを参照するのではなく、ボックスのコレクションを参照します。そのような x は、ボックス 1、2、および 3 を指し、それぞれに 1 2 および 3 の値が含まれています。したがって、x が示すリストの最初のボックスの内容を変更すると、x 自体は変更されず、ボックスのリストのままです。そのうちの 1 つの値が変更されています。この場合の y はボックスのリストで、最初のボックスは実際にはボックスではありませんが、別のボックス セットへのポインタが含まれています。

于 2012-10-12T12:58:59.060 に答える
0

左側の値として変数名を持つ演算子を使用する=と、左側の名前が右側のオブジェクトにバインド (または再バインド) されます。y = x + 3は、値 を持つオブジェクトをy参照し、変数 x が値 を持つオブジェクトを参照するようにします。int5x = 8int8

左側は のようなものx[0]で、アイテムの割り当てを行っており、 の 0 番目のアイテムのみを変更していxます。この名前xは元のリストを参照しており、これは が指すリストのメンバーでもありyます。

于 2012-10-12T12:57:04.517 に答える
0

本当にその動作が必要な場合は、関数を使用する必要があります。

>>> x = 2
>>> y = lambda: x + 3
>>> y()
5
>>> x = 8
>>> y()
11

x は不変であるため、代入すると、将来の変更を反映しない新しいオブジェクトが常に作成されます。

于 2012-10-12T13:09:33.260 に答える
0

あなたの例を見て、変数を置き換えましょう:

オリジナル:

x = 2
y = x + 3
###  printing y will yield 5
x = 8    # x now holds the value of 8 instead of 2
###  printing y will still yield 5 (why is that? if Y always points to x and adds 3 to it?)

in contrast with this:

x = [1,2,3]
y = [x,4,5,6]
x[0] = 50

置換:

x = 2
y = 2 + 3
###  printing y will yield 5
x = 8    
###  printing y will still yield 5 because it is set to 2+3


x = [1,2,3] 
y = [[1,2,3],4,5,6] #[1,2,3] is the same list as x
x[0] = 50 # x still holds the value of the same list, 
#however you're changing the value of the first element of the, 
#you're not changing x itself though.

最初の例では、x 自体の値を変更しています。2 番目の例では、x を同​​じ値のままにして、x のプロパティを変更しています。

于 2012-10-12T13:13:58.177 に答える