2011-09-12 7 views
20

if文の外側にあるif文内の変数スコープはPythonでは可変ですか?if文のPython変数スコープ

以下のケースでは、名前は最初にifブロック内で定義されますが、変数はifブロックの外側からも見えます。私はエラーが発生することを期待していたが、「ジョー」が印刷される。

if 1==1: 
    name = 'joe' 
print(name) 

答えて

36

ifステートメントはPythonでスコープを定義しません。

どちらループ、with文、try/exceptなど

のみモジュール、関数やクラスは、スコープを定義します。

PythonチュートリアルのPython Scopes and Namespacesを参照してください。

+0

@Owen、eh?参照? –

+0

ああ...申し訳ありません。私はそれについて間違っていました。 – Owen

+0

@スコープを定義していない 'nonlocal'というキーワードを考えているのですが、囲んでいるが非グローバルなスコープを参照するための構文を追加するだけです。 – agf

1

すべてのPythonの変数は、関数レベルのスコープに住ん: 2つの関連質問がinterestionディスカッションを行いました。私はif文の前に、変数を宣言する必要はありませんその方法

if foo.contains('bar'): 
    value = 2 + foo.count('b') 
else: 
    value = 0 

:(グローバルとクロージャ変数を無視して)

このような場合に有用です。

+0

最初の行が間違っています。クラス定義に変数を定義すると、グローバルスコープ、クロージャー、または関数レベルのスコープには含まれません。 – agf

+0

@agf - クラスは新しいスコープを定義しません - 修飾されていないメソッドからクラス変数にアクセスすることはできません(つまり 'thing'だけでなく' Class.thing'または 'self.thing'が必要です)。彼らは、しかし、彼ら自身の名前空間を持っています。 – detly

+0

@agf - 実際、私はそれについて考えるので、メソッド定義外のクラス定義からクラス変数にアクセスすることができると思います。 – detly