これを「可変性」の問題と見なすのは正しいと思います。投稿したコードは「UnboundLocalError」をスローしますが、次のコードはスローしません。
def outer():
a = 0
def inner():
print a
inner()
outer()
Python では、変数の値を外側のスコープから内側のスコープに再割り当てすることはできません (この場合は適用されないキーワード「global」を使用していない限り)。
この Python 2.6.2 ドキュメントの「クラス」ドキュメントの下部セクションを確認してください。
[…] 名前がグローバルと宣言されている場合、すべての参照と割り当ては、モジュールのグローバル名を含む中間スコープに直接移動します。それ以外の場合、最も内側のスコープの外側にあるすべての変数は読み取り専用です (そのような変数に書き込もうとすると、最も内側のスコープに新しいローカル変数が作成され、同じ名前の外側の変数は変更されません)。
「UnboundLocalError」は、関数が実際に「a」という新しい変数を宣言し、すぐに「+ =」操作を実行しようとしているためですが、「a」にはまだ値がないため、これは失敗します。(「a+=1」を「a = a+1」と表示すると、「a」が定義されていない場合に問題を確認できます)。
一般に、「a」を変更したい場合、人々が通常それを回避する方法は、変更可能な型を使用して「a」を渡すことです (リストや辞書など)。変更可能な型の内容を介して "a" を変更できます (このセットアップでのテストでおそらく気付いたように)。
それが役立つことを願っています!