質問: 「Pythonでは、代入するときはすべて参照渡しだ」と本に書いてあったのですが、イミュータブルなオブジェクトは代入するときに値渡しですよね。 では、本に書いてあった「Pythonでは、代入するときはすべて参照渡しだ」という記述は嘘ですよね。 多くのサイトで、「Pythonでは、代入するときはすべて参照渡しだ」と書いてあるのですが、なぜそうではないのにそんなことを書いているのですか。なにか意図があったりするのでしょうか...
回答: ~~immutable なオブジェクトは変更しようとしたタイミングで別オブジェクトとして複製されるコピーオンライト戦略をとっています。~~ Wikipediaより引用 > > 複製を要求されても、コピーをした振りをして、とりあえず原本をそのまま参照させるが、ただし、そのままで本当に書き換えてはまずい。原本またはコピーのどちらかを書き換えようとしたときに、それを検出し、その時点ではじめて新たな空き領域を探して割り当て、コピーを実行する。これが「書き換え時にコピーする」、すなわちコピーオンライト (Copy-On-Write) の基本的な形態である。 > > コピーオンライト > > > 実際、以下のようにこの挙動を確認できます。 id() でオブジェクトの識別子が取得できるので(Cでいうオブジェクトのアドレスと思えばよい) これで確認してみると、 ``` a = 1 # int は immutable print(id(a)) # 9145152 b = a print(id(b)) # 9145152 この時点で a と指す実態は同じ b = 2 # immutable なオブジェクトを変更しようとすると.... print(id(b)) # 9145184 a とは別のオブジェクトとなる ``` 変更するまでは a と b のオブジェクトは同じであることがわかります。