さて、いくつかの画像で説明してみましょう。
Pythonでは、すべてがオブジェクトです。これらのオブジェクトは変数によって参照されます。リストやタプルなどの一部の種類のオブジェクトは、他のオブジェクトへの参照を格納するだけです。
とはいえ、実行すると
myVar = ["jhhj", "hgc"]
myTuple = ([1,2,3], [4,5,6], myVar)
このシナリオは多かれ少なかれ得られます。
各オブジェクトは、ボックス/長方形で表されます。2つの文字列オブジェクト"jhhj"
と"hgc"
。また、変数で示されるリストオブジェクトがありますmyVar
。このリストオブジェクトは、両方の文字列オブジェクトを指します。myTuple
また、 ;で参照されるタプルオブジェクトがあります。このタプルオブジェクトは、他の2つのリストと。によって参照されるリストを指しますmyVar
。
実行すると
myVar.append('lololol')
何が起こりますか?さて、リストオブジェクト(偶然にが指しているmyVar
)はもう1つの値、文字列オブジェクトを参照し始めます"lololol"
:
myVar
それでもリストオブジェクトを参照していることに注意してください。何が起こったのかというと、リストオブジェクトが変更されたということです。タプルからまたはタプルからこのリストオブジェクトを見ることができますmyVar
。同じ変更で同じオブジェクトが表示されます。
OTOH、実行すると
myVar = "lol"
myTuple = ([1,2,3], [4,5,6], myVar)
あなたはこのようなものを手に入れます:
ここmyVar
で、文字列オブジェクトをポイントし"lol"
、タプルは3番目の位置でそれを参照します。さて、実行すると
myVar = "lolol"
myVar
別のオブジェクトを指すようにしているだけです。タプルオブジェクトは"lol"
以前と同じようにポイントします。
したがって、新しい値を変数に関連付けると、この変数が指す値が変更されるだけです。変数によって参照される以前の値は引き続き存在し*、それを指す他の変数またはオブジェクトは引き続きそれを指します。属性変数のみが変更されます。
PS:また、私は少し前に漠然と関連した質問に答えました。答えが役立つかもしれません。
*ガベージコレクターによって収集された場合を除きますが、これはもう1つの長い歴史です。