Python での割り当てでは、コピーが作成されることはありません (技術的には、クラス メンバーの割り当てが__setattr__
、プロパティ、または記述子を使用して再定義された場合にのみ可能です)。
だから後
a = foo()
b = a
返されたものはfoo
コピーされておらず、代わりに 2 つの変数があり、同じオブジェクトa
をb
指しています。オブジェクトが不変かどうかは関係ありません。
a
ただし、不変オブジェクトの場合、これが事実であるかどうかを判断するのは困難です (1 つの変数を使用してオブジェクトを変更し、別の変数を使用して変更が表示されるかどうかを確認することはできないため) b
。
一部の不変オブジェクトについても、Python は新しいオブジェクトを作成する代わりに古いオブジェクトを自由に再利用できます。
a = x + y
b = x + y
x
との両方y
が数値である場合 (合計は数値であり、不変です)、 と の両方が同じオブジェクトを指している可能性がありa
ますb
。そのような保証はないことに注意してください...代わりに、同じ値を持つ異なるオブジェクトを指している可能性もあります。
覚えておくべき重要なことは、egcopy
またはdeepcopy
. これは、変更可能なオブジェクトで驚きを避けるために非常に重要です。
たとえば、よくあるイディオムは次のとおりです。
class Polygon:
def __init__(self, pts):
self.pts = pts[:]
...
この場合、オブジェクトの作成後にコンストラクタに渡されたリストに変更が適用された場合に、ポイント リストが予期せず変更されないようにするために、ポイントの配列全体のコピーを作成するself.pts = pts[:]
代わりに使用されます。self.pts = pts