質問するログイン新規登録

回答編集履歴

2

重要な注意点を追記

2021/09/06 06:31

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -1,3 +1,8 @@
1
+ 根本的な問題として、maxDepthが関数かメソッドなのかは置いておいて、値を返すだけでなく引数の属性を変更あるいは追加しているということに注意が必要です。
2
+ 勝手にself.max_depthをmax_depthに変更すると、戻り値が返ったとしても、引数の属性(self.max_depth)は想定通りの値が入っていません。呼び出し側が後でself.max_depthを使おうとしてもそれが使えませんので、全体として正しく動く保証がなくなります。
3
+
4
+ とりあえず、上記のことが絶対に起こらないという前提で考えてみます。
5
+
1
6
  これはメソッドの話なのかメソッドの話ではないのかはっきりしていませんが、いずれにしてもインスタンス変数かどうかとは関係ない話です。
2
7
 
3
8
  selfという名前を使うと、インスタンス変数特有の話をしているように見えて誤解を生じやすいのでarg0という名前に変更して説明します。

1

用語の間違いを修正&参照リンクを追加

2021/09/06 06:31

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -47,7 +47,9 @@
47
47
 
48
48
  ```
49
49
 
50
- 2行目のmax_depthは関数maxDepthの自由変数となります。ここで代入をしているのでローカル変数と解釈されます。
50
+ 2行目のmax_depthは関数maxDepthの変数となります。ここで定義をしているのでローカル変数と解釈されます。
51
- 関数helper内のmax_depthは自由変数となり、代入があるのでローカル変数と解釈されます。すると右辺で参照しているので未定義の変数を使おうとしていることになってエラーとなります。
51
+ 関数helper内のmax_depthは変数となり、ここで定義をしているのでローカル変数と解釈されます。すると右辺で参照しているので未定義の変数を使おうとしていることになってエラーとなります。
52
52
 
53
+ 詳しくは、[4.2. 名前づけと束縛 (naming and binding)](https://docs.python.org/ja/3/reference/executionmodel.html#naming-and-binding)をお読みください。
54
+
53
55
  これは、maxDepthがメソッドの場合でも同じです。