回答編集履歴

4

追記

2019/02/12 11:04

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -88,4 +88,4 @@
88
88
 
89
89
 
90
90
 
91
- これをちゃんと説明しようとすると長くなるので大まかな流れだけ説明すると、pythonの足し算は、通常左側のオブジェクトの`__add__`メソッドが呼ばれます。`__add__`がオブジェクト自身を書き換えるように実装することも不可能ではありませんが(mutableなオブジェクトなら)、通常は結果を表す新たなオブジェクトを返すようになっています。その結果のオブジェクトをローカル変数の`x`に束縛する……というのが`f`の中の`x = x + 1`の挙動です。この処理は呼び出し時の実引数(オブジェクト`a`ないし`10`)には何ら影響を及ぼさないことがわかるかと思います。
91
+ これをちゃんと説明しようとすると長くなるので大まかな流れだけ説明すると、pythonの足し算は、通常左側のオブジェクトの`__add__`メソッドが呼ばれる仕組みになっています。`x + 1`は`x.__add__(1)`として扱われます。`__add__`がオブジェクト自身を書き換えるように実装することも不可能ではありませんが(mutableなオブジェクトなら)、通常は結果を表す新たなオブジェクトを返すようになっています。その結果のオブジェクトをローカル変数の`x`に束縛する……というのが`f`の中の`x = x + 1`の挙動です。この処理は呼び出し時の実引数(オブジェクト`a`ないし`10`)には何ら影響を及ぼさないことがわかるかと思います。

3

追記

2019/02/12 11:04

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -57,3 +57,35 @@
57
57
 
58
58
 
59
59
  JavaやPHPなどプリミティブ型と参照型で扱いを変える言語があるので、もしかしたらそれらと混同しているのかもしれませんが、pythonの仕様をプリミティブ型と参照型という用語で説明するなら「すべて参照型で、プリミティブ型は存在しない」ということになります。
60
+
61
+
62
+
63
+ ---
64
+
65
+
66
+
67
+ たしかに値渡しかな? と思うこともあります。
68
+
69
+
70
+
71
+ ```python
72
+
73
+ >>> def f(x):
74
+
75
+ ... x = x + 1
76
+
77
+ ...
78
+
79
+ >>> a = 10
80
+
81
+ >>> f(a)
82
+
83
+ >>> a
84
+
85
+ 10
86
+
87
+ ```
88
+
89
+
90
+
91
+ これをちゃんと説明しようとすると長くなるので大まかな流れだけ説明すると、pythonの足し算は、通常左側のオブジェクトの`__add__`メソッドが呼ばれます。`__add__`がオブジェクト自身を書き換えるように実装することも不可能ではありませんが(mutableなオブジェクトなら)、通常は結果を表す新たなオブジェクトを返すようになっています。その結果のオブジェクトをローカル変数の`x`に束縛する……というのが`f`の中の`x = x + 1`の挙動です。この処理は呼び出し時の実引数(オブジェクト`a`ないし`10`)には何ら影響を及ぼさないことがわかるかと思います。

2

追記

2019/02/12 11:01

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -41,3 +41,19 @@
41
41
  `id`関数については以下を参照。
42
42
 
43
43
  [2. 組み込み関数 — Python 3.6.5 ドキュメント | id](https://docs.python.jp/3/library/functions.html#id)
44
+
45
+
46
+
47
+ ---
48
+
49
+
50
+
51
+ > イミュータブルなオブジェクトは代入するときに値渡しですよね。
52
+
53
+
54
+
55
+ そういう仕様はpythonにはありません。immutableだからといって、mutableなオブジェクトと扱いが区別される訳ではありません。
56
+
57
+
58
+
59
+ JavaやPHPなどプリミティブ型と参照型で扱いを変える言語があるので、もしかしたらそれらと混同しているのかもしれませんが、pythonの仕様をプリミティブ型と参照型という用語で説明するなら「すべて参照型で、プリミティブ型は存在しない」ということになります。

1

修正

2019/02/12 10:02

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- すべて参照です。
9
+ 代入だろうと関数呼び出しだろうと、すべて参照です。
10
10
 
11
11
 
12
12