回答編集履歴

1

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

2020/10/31 01:52

投稿

lehshell
lehshell

スコア1147

test CHANGED
@@ -46,7 +46,13 @@
46
46
 
47
47
  補足事項として今回のコードのようにローカルなスコープ内でも global 宣言して global 変数を定義可能です。
48
48
 
49
+ (Python では変数への代入が変数の定義です)
50
+
49
- 気を付けることとして、変数を参照するだけの場合は外側のスコープの変数になる点があります。
51
+ ~~気を付けることとして、変数を参照するだけの場合は外側のスコープの変数になる点があります。~~
52
+
53
+ 気を付けることとして、関数内のスコープで global, nonlocal の宣言がなく、変数とオブジェクトの束縛関係を更新しない場合は外側のスコープの変数になる点があります。
54
+
55
+
50
56
 
51
57
  ```Python
52
58
 
@@ -71,3 +77,35 @@
71
77
  # F: foo
72
78
 
73
79
  ```
80
+
81
+ ```Python
82
+
83
+ lst = [0, 1, 2]
84
+
85
+ def scope():
86
+
87
+ print("G:", lst) # lst is global's loc
88
+
89
+ def do_local():
90
+
91
+ lst[1] = 4 # lst is global's loc lst 変数の束縛関係は更新されない
92
+
93
+ print("H:", lst) # lst is global's loc
94
+
95
+ do_local()
96
+
97
+ lst[0] = 3 # lst is global's loc lst 変数の束縛関係は更新されない
98
+
99
+ print("I:", lst) # lst is global's loc
100
+
101
+
102
+
103
+ scope()
104
+
105
+ # G: [0, 1, 2]
106
+
107
+ # H: [0, 4, 2]
108
+
109
+ # I: [3, 4, 2]
110
+
111
+ ```