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

回答編集履歴

1

誤解を招く表現を修正し、サンプルコードを追加しました。

2020/10/31 01:52

投稿

lehshell
lehshell

スコア1180

answer CHANGED
@@ -22,7 +22,10 @@
22
22
 
23
23
  ```
24
24
  補足事項として今回のコードのようにローカルなスコープ内でも global 宣言して global 変数を定義可能です。
25
+ (Python では変数への代入が変数の定義です)
25
- 気を付けることとして、変数を参照するだけの場合は外側のスコープの変数になる点があります。
26
+ ~~気を付けることとして、変数を参照するだけの場合は外側のスコープの変数になる点があります。~~
27
+ 気を付けることとして、関数内のスコープで global, nonlocal の宣言がなく、変数とオブジェクトの束縛関係を更新しない場合は外側のスコープの変数になる点があります。
28
+
26
29
  ```Python
27
30
  loc = "foo"
28
31
  def scope():
@@ -34,4 +37,20 @@
34
37
  scope()
35
38
  # E: foo
36
39
  # F: foo
40
+ ```
41
+ ```Python
42
+ lst = [0, 1, 2]
43
+ def scope():
44
+ print("G:", lst) # lst is global's loc
45
+ def do_local():
46
+ lst[1] = 4 # lst is global's loc lst 変数の束縛関係は更新されない
47
+ print("H:", lst) # lst is global's loc
48
+ do_local()
49
+ lst[0] = 3 # lst is global's loc lst 変数の束縛関係は更新されない
50
+ print("I:", lst) # lst is global's loc
51
+
52
+ scope()
53
+ # G: [0, 1, 2]
54
+ # H: [0, 4, 2]
55
+ # I: [3, 4, 2]
37
56
  ```