>>354
いくつか勉強不足な箇所はあるけど、「スコープがぐちゃぐちゃ」という
指摘に関しては、まったくもってそのとおりだね

>>> x = 1  # グローバル変数 x を初期値 1 で宣言
>>> def f(dx): x = x + dx  # 変数 x を破壊的に更新する手続き f を定義
... ^D
>>> f(2)  # 手続き f を引数 2 で呼び出してみると・・・
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
UnboundLocalError: local variable 'x' referenced before assignment

まさに公式文書に書かれている通りの結果になった:
 https://docs.python.jp/3/glossary.html#term-nested-scope
   ネストされたスコープはデフォルトでは変数の参照だけができ、
   変数の代入はできないので注意してください。

では、続けてみよう
>>> array = [1,2,3]  # グローバル変数 array を初期値 [1,2,3] で宣言
>>> def f(x): array.append(x)  # 変数 array を破壊的に更新する手続き f を定義
... ^D
>>> array  # 念のため、変数 array の内容を確認
[1, 2, 3]
>>> f(4)  # 手続き f を引数 4 で呼び出してみると・・・
>>> array
[1, 2, 3, 4]  # あれれ、グローバル変数なのに書き込みできてしまったぞぉ?!(棒