質問: 1 func_2(b) print(b) # 1 ```
回答: 標準モジュールのrandom.shuffleなんかその動作です。 > > 可読性が悪いので、returnで引数を明示する方がベターかと思いますが、このコード(func_1)の利点はありますでしょうか? > > > 複数の要素を書き換えたりといった、ある程度複雑な処理だとこれがベターな場合があります。 結果のリストを作って返す? メモリ二倍食いますね。オーバーヘッドもかさみます(pythonだとちまちま代入して書き換えるより、リスト丸ごと内包表記で作った方が早い可能性もあるとはいえ)。 > > func_1では値が上書きされるのに、func_2ではなぜ値が上書きされないのでしょうか? > > > func_2は関数のローカル名前空間に対する操作、func_1はリストオブジェクトに対する操作だから。 変数に代入するという行為は名前空間上で名前にオブジェクトを束縛するという行為です。名前空間を抜ければ何も影響は残りません。 `x[0]`に代入するのだと、`x`の`__setitem__`メソッドの呼び出しとして内部的には処理されます。全くの別物です。 リストや辞書の要素に代入する場合、あとオブジェクトの属性に代入する場合は変数への代入とは違う処理だと思ってください。構文上で区別できないので混乱しますが。