Pythonのスコープは本当にバグってて
変数への代入の有る無しでスコープが変わる
どこのスコープに属しているか調べるのに
代入の有る無しを調べなければならない
変数への代入があればインナースコープで
参照のみならアウタースコープ
つまりは 変数宣言を無くしたことで
変数宣言->変数への(最初の)代入 としたので
代入の有る無しでスコープが変わるという糞になった
これに加えてnonlocalまである
このような動作は安全性の面から好ましいという人もいるが
それは絶対嘘で、実装上の都合でそうなったに過ぎない
本当にひどいと思うが
しかしRubyのスコープが優れているという結論には繋がらない