コード内:
y = 7
x = y
x = 8
今はy
7 になり、x は 8 になります。しかし、実際には変更したいy
です。の参照を割り当ててy
それを行うことはできますか?
たとえば、C++ では、次のように同じことを実現できます。
int y = 8;
int &x = y;
x = 9;
y
これで&は両方ともx
9 になります
いいえ、あなたがすることはできません。他の回答が指摘しているように、変更可能なオブジェクトのエイリアシングを (ab?) 使用して、同様の効果を得ることができます。ただし、それは C++ の参照と同じではありません。誤解を避けるために実際に何が起こるかを説明したいと思います。
C++ (およびその他の言語) では、変数 (およびオブジェクト フィールド、コレクション内のエントリなど) が格納場所であり、値 (たとえば、整数、オブジェクト、またはポインター) を書き込みます。その場所。このモデルでは、参照は (あらゆる種類の) 保存場所のエイリアスです。非参照変数に代入すると、値が保存場所にコピーされます (単なるポインターであっても値のままです)。参照に代入すると、別の場所の保存場所にコピーされます。参照自体を変更することはできないことに注意してください。一度バインドすると (そして、作成したらすぐに変更する必要があります)、その参照へのすべての割り当ては、参照ではなく、参照されるものを変更します。
Python (およびその他の言語) では、変数 (およびオブジェクト フィールド、コレクション内のエントリなど) は単なる名前です。価値観はどこかにあるelse (たとえば、ヒープ全体に散らばる) と、変数が値を参照する (C++ 参照という意味ではなく、ポインターからポインター演算を引いたものに似ている)。複数の名前で同じ値を参照できます (これは一般的には良いことです)。Python (およびその他の言語) は、値を参照するために必要なものはすべて参照として呼び出しますが、C++ 参照や参照渡しなどとはまったく関係ありません。変数 (またはオブジェクト フィールドなど) への割り当ては、単純に別の値を参照するようにします。格納場所のモデル全体は Python には適用されません。プログラマは値の格納場所を処理しません。彼が保存してシャッフルするのはすべて Python 参照であり、それらは Python の値ではないため、他の Python 参照のターゲットにすることはできません。
これはすべて、値の可変性とは無関係です。たとえば、int とリストでも同じです。いずれかを参照する変数を取得して、それが指すオブジェクトを上書きすることはできません。オブジェクト自体の一部を変更するようにオブジェクトに指示することしかできません。たとえば、オブジェクトに含まれる参照を変更します。
これはより限定的なモデルですか?おそらくですが、ほとんどの場合、十分に強力です。そうでない場合は、以下に示すようなカスタム クラスを使用するか、(同等ですが、あまり明白ではありませんが) 単一要素のコレクションを使用して回避できます。
class Reference:
def __init__(self, val):
self._value = val # just refers to val, no copy
def get(self):
return self._value
def set(self, val):
self._value = val
それでも、「通常の」変数またはオブジェクト フィールドにエイリアスを設定することはできませんが、複数の変数で同じReference
オブジェクトを参照することはできます (mutable-singleton-collection の代替案についても同様です)。.get()
常に/ .set()
(または)を使用するように注意する必要があります[0]
。
いいえ、Python にはこの機能がありません。
リスト (またはその他の変更可能なオブジェクト) がある場合は、x と y の両方がバインドされているオブジェクトを変更することで、必要なことを行うことができます。
>>> x = [7]
>>> y = x
>>> y[0] = 8
>>> print x
[8]
オンラインでの動作を確認してください: ideone
または、自作のコンテナーを使用することもできます。
class Value(object):
def __init__(self, value): self.value = value
y = Value(7)
x = y
x.value = 8
print y.value
これには変更可能なオブジェクトを使用する必要があります。
Python x
&では、オブジェクトy
への単なる参照であるためy = 7
、y はオブジェクトを指すことを意味します7
。
x=y
はx
あまりにも を指すことを意味します7
が、7
は不変であるため、x の値を変更すると単にオブジェクトが変更され、7
をy
指したままになり7
ます。
>>> y = [7]
>>> x = y
>>> x[0] = 8 # here you're changing [7] not x or y, x & y are just references to [7]
>>> y
[8]