回答編集履歴

3

変更

2018/11/14 04:27

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -2,23 +2,23 @@
2
2
 
3
3
 
4
4
 
5
- さて、質問文のコードのそれぞれの関数の中にある代入文は、一見するとどちらも「ただの代入文」っぽく見えます。が、実のところまったく異なった処理が為されます。
5
+ さて、質問文のコードのそれぞれの関数の中にある代入文は、一見するとどちらも「ただの代入文」っぽく見えます。が、実のところそれぞれまったく異なった処理が為されます。
6
6
 
7
7
 
8
8
 
9
9
  - `val = val + 3`
10
10
 
11
- 左辺の`val`は単なる識別子なので、これが実行された名前空間上の`val`という識別子に対して`val + 3`を評価した結果を束縛します。なお、`val + 3`の評価では通常新しいオブジェクトが返りますが、必須ではありません。
11
+ 左辺の`val`は単なる識別子なので、これが実行された名前空間上の`val`という識別子に対して`val + 3`を評価した結果を束縛します。なお、`val + 3`の評価では通常新しいオブジェクトが返りますが、必須ではありません(新しいオブジェクトを返す設計になっているオブジェクトが圧倒的に多いというだけで、オブジェクトの`__add__`メソッドを自分自身を返すように実装することもできます)
12
12
 
13
13
 
14
14
 
15
15
  - `ref[0] = ref[0] + 3`
16
16
 
17
- 左辺の`ref[0]`は添字表記なので、まず`ref`が評価されて添字表記で代入できるオブジェクトかどうかが確認されます。問題なければ、次に添字の中身が評価されて、どの添字に代入するかを評価します(ここから`list`の場合や`dict`の場合、はたまた自作オブジェクトの場合など型によって処理が分かれる要素があ代入先が決まったら、`ref[0] + 3`を評価した結果を代入します。ここで実際には、左辺のオブジェクトの`__setitem__`([リンク](https://docs.python.org/ja/3/reference/datamodel.html#object.__setitem__))というメソッドが呼ばれて(組み込み型とかだとメソッド呼び出しを短絡する最適化か何かがあるかもしれませんが)、オブジェクトの内部状態が書き換えられます。
17
+ 左辺の`ref[0]`は添字表記なので、まず`ref`が評価されて添字表記で代入できるオブジェクトかどうかが確認されます。問題なければ、次に添字の中身が評価されて、どの添字に代入するかを評価します(ここから`list`の場合や`dict`の場合、はたまた自作オブジェクトの場合など型によって処理が分かれる要素があります。)代入先が決まったら、`ref[0] + 3`を評価した結果を代入します。ここで実際には、左辺のオブジェクトの`__setitem__`([リンク](https://docs.python.org/ja/3/reference/datamodel.html#object.__setitem__))というメソッドが呼ばれて(組み込み型だとメソッド呼び出しを短絡する最適化か何かがあるかもしれませんが)、オブジェクトの内部状態が書き換えられます。
18
18
 
19
19
 
20
20
 
21
- この辺の仕様は以下に書いてあります(構文のリファレンスなので読むのはいと思いますが)。
21
+ この辺の仕様は以下に書いてあります(構文のリファレンスなので読むのはしんどいと思いますが)。
22
22
 
23
23
 
24
24
 
@@ -26,8 +26,8 @@
26
26
 
27
27
 
28
28
 
29
- 要するに識別子に対して代入すると名前空間のシンボルテーブルを操作することになるのに対し、オブジェクトの添字表記に対して代入するとオブジェクトの状態(具体的には`そのオブジェクト[その添字]`が指すもの)を変えることができます。
29
+ 要するに識別子に対して代入すると名前空間のシンボルテーブルを操作することになるのに対し、オブジェクトの添字表記に対して代入するとオブジェクトの(具体的には`そのオブジェクト[その添字]`が指すもの)を変えることになります。
30
30
 
31
31
 
32
32
 
33
- 前者の場合、ローカルの名前空間をいじっても呼び出し元に波及する要素はありませんが、後者の場合は呼び出し元と呼び出し先で引数のオブジェクトが共有されていますから(最初に書いた通り、整数だろうとリストだろうとオブジェクトそのものは共有されるのです)、呼び出し元にもオブジェクトの値の変化という形で影響が波及します。
33
+ 前者の場合、ローカルの名前空間をいじっても呼び出し元に波及する要素はありませんが、後者の場合は呼び出し元と呼び出し先で引数のオブジェクトが共有されていますから(最初に書いた通り、整数だろうとリストだろうとオブジェクトそのものは参照により共有されるのです)、呼び出し元にもオブジェクトの値の変化という形で影響が波及します。

2

追記

2018/11/14 04:27

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- さて、質問文のコードはどちらも「ただの代入文」っぽく見えますが、挙動はまったく異なます。
5
+ さて、質問文のコードのそれぞれの関数の中にある代入文、一見するとどちらも「ただの代入文」っぽく見えますが、実のところまったく異なった処理が為されます。
6
6
 
7
7
 
8
8
 

1

ちょい修正

2018/11/14 04:00

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  - `val = val + 3`
10
10
 
11
- 左辺の`val`は単なる識別子なので、これが実行された名前空間上の`val`という識別子に対して`val + 3`を評価した結果を束縛します。なお、pythonの数値はimmutableなので`val + 3`の評価では通常新しいオブジェクトが返りますが、必須ではありません。
11
+ 左辺の`val`は単なる識別子なので、これが実行された名前空間上の`val`という識別子に対して`val + 3`を評価した結果を束縛します。なお、`val + 3`の評価では通常新しいオブジェクトが返りますが、必須ではありません。
12
12
 
13
13
 
14
14