55

コード内:

y = 7
x = y
x = 8

今はy7 になり、x は 8 になります。しかし、実際には変更したいyです。の参照を割り当ててyそれを行うことはできますか?

たとえば、C++ では、次のように同じことを実現できます。

int y = 8;
int &x = y;
x = 9;

yこれで&は両方ともx9 になります

4

4 に答える 4

72

いいえ、あなたがすることはできません。他の回答が指摘しているように、変更可能なオブジェクトのエイリアシングを (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]

于 2012-06-27T09:07:00.150 に答える
19

いいえ、Python にはこの機能がありません。

リスト (またはその他の変更可能なオブジェクト) がある場合は、x と y の両方がバインドされているオブジェクトを変更することで、必要なことを行うことができます。

>>> x = [7]
>>> y = x
>>> y[0] = 8
>>> print x
[8]

オンラインでの動作を確認してください: ideone

于 2012-06-27T08:45:27.857 に答える
8

または、自作のコンテナーを使用することもできます。

class Value(object):
    def __init__(self, value): self.value = value

y = Value(7)
x = y
x.value = 8
print y.value

イデオン

于 2012-06-27T09:05:56.437 に答える
6

これには変更可能なオブジェクトを使用する必要があります。

Python x&では、オブジェクトyへの単なる参照であるためy = 7、y はオブジェクトを指すことを意味します7x=yxあまりにも を指すことを意味します7が、7は不変であるため、x の値を変更すると単にオブジェクトが変更され、7y指したままになり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]
于 2012-06-27T08:46:15.577 に答える