PlayGround Article Python 変数のスコープがなんか変 hiroki 2019年1月26日 Created with Sketch. 1 Created with Sketch. 42 piffett 理科大生のコスプレイヤーやってます。 はじめに,以下のコードはエラーを発生しません. ``` >>> INT = 1 >>> def test(): ... if INT == 1: ... print(INT) ... >>> test() 1 ``` 次に,以下のコードはエラーを発生します. なぜならば,関数`test`内で変数`INT`に値を代入するという操作を行った場合,グローバル変数`INT`は隠されます.ゆえに変数`INT`は`if INT == 1`の段階ではまだ初期化されていない変数なので,`UnboundLocalError`が発生します. ``` >>> INT = 1 >>> def test(): ... if INT == 1: ... INT = 2 ... >>> test() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in test UnboundLocalError: local variable 'INT' referenced before assignment ``` そして次が,エラーは発生しないが引っかかったコードです. ``` >>> LIST = [1] >>> def test(): ... if LIST[0] == 1: ... LIST[0] = 2 ... >>> test() >>> LIST [2] ``` `int`型で初期化した`INT`の代わりに,`list`型で初期化した`LIST`の要素に対して,前掲のような操作をしても,`UnboundLocalError`は発生しません. 理由として,` LIST`が`list`型の変数で,ミュータブルなオブジェクトだから,関数`test`のスコープで` LIST`の0番目が参照する値を`1`から`2`に変更しても,ローカル変数として初期化されなかったのだと考えたのですが......誤りがございましたら,ご指摘いただけると幸いです.