9085


> Problem 6: What will be the output of the following program.
[code]

    a, b = 2, 3
    c, b = a, c + 1
    print a, b, c
    
[/code]

こちらを実行しようとすると。。。

[code]

    Traceback (most recent call last):
      File "<console>", line 1, in <module>
    NameError: name 'c' is not defined
    
[/code]

と出てきます。

[code]

    c = a
    
[/code]

としているにもかかわらずなので、よく理解が出来ません。


CC BY-SA 3.0
2015-04-07T18:54:45.397
8881
2015-04-12T23:31:55.820
2015-04-11T06:45:01.567
49
9208
question
python
c, b = a, c + 1でNameError例外が送出される理由は？


まずはじめに`a, c + 1`が計算され、その結果が`c, b` に代入されるためです。


CC BY-SA 3.0
2015-04-07T19:27:13.133
8883
2015-04-07T19:27:13.133
3271
8881
answer


`NameError`になるのは、まさにそのエラー行に書かれているように、`c`という変数が登場する前に`c +
1`という、`c`の中身を参照する操作を行っているためです。

[code]

    c, b = a, c + 1
    
[/code]

この行の、`c + 1`を処理する時点で、まだ`c`という変数が定義されていないとPythonコンパイラに解釈されました。
_同じ行に書かれているので、どの順番で実行するかはPython言語の仕様とコンパイラの実装次第になります。_

解決法はuser2989353さんご自身が先に試されているとおり、処理を2行に分割し、`c`の初期値の設定を`c +
1`を行う前に実行させるよう、処理の順番を強制するしかありません。


CC BY-SA 3.0
2015-04-12T13:23:15.917
9076
2015-04-12T13:23:15.917
652
8881
answer


Python
の言語リファレンスの[評価順序の項](http://docs.python.jp/3/reference/expressions.html#evaluation-
order)によれば、

> Python は、式を左から右へと順に評価します。ただし、代入式を評価するときは、代入演算子の右側項が左側項よりも先に評価されます。

とありますので、代入演算子の右辺の式が全て計算されてから、左辺に代入されます。リンク先には

[code]

    expr3, expr4 = expr1, expr2
    
[/code]

という例があります (expr1, expr2, expr3, expr4 の順に計算される)。


CC BY-SA 3.0
2015-04-12T23:31:55.820
9085
2015-04-12T23:31:55.820
3605
8881
answer