2016-06-22 4 views
3

私は現在、私はPythonがブロックベースのスコープをサポートしていないという事実を読んで理解パイソンPythonでのブロックスコープ - 関数内でjavascriptホイストと似ていますか?

def foo(a): 
    if a==12: 
    var = "Same" 
    else: 
    var = "different" 

にコードのこの部分を理解しようとしています。したがって、関数内で作成されたすべてのもの(ループ内または条件文内)は、関数の他のメンバーに公開されています。また、スコープ規則hereも読んでいます。この時点で、これらのスコープ内の変数は、JavaScriptのように関数内に持ち込まれていると仮定すると同じでしょうか?

+0

まあ、Pythonには変数の宣言がありませんので、javascriptの 'var'ホイストとの比較は難しいです。私はxに何かを割り当てた後に 'global x'宣言を置くことができることを知っています。それはまだ動作しますが、それはリンゴとオレンジのようなものです。 – Kevin

+0

@ jamesfranco - これは決して安全ではありません。なぜあなたはあなたのPythonインタプリタを起動して見つけませんか? –

+0

@KevinどのようにPythonの宣言(またはその欠如)は、 'var'キーワード以外のJavascriptとは異なりますか? –

答えて

4

あなたはそれを持っています。 globalで明示的に宣言されていない関数内に割り当てられた名前(ローカルスコープにないことを示すためにPy3がnonlocalを追加していますが、グローバルスコープにまっすぐジャンプするのではなくラッピングスコープを参照する)は、 (ローカルの配列にスペースが予約されていますが)代入の前にそれを読み取ると、UnboundLocalErrorが発生します。

+0

これはトップの "モジュール"レベルにも当てはまります。私は今、ファイル(!)の後に定義された変数(シングルトン、それが起こる)を参照するクラスを読み込んでいます – GreenAsJade

関連する問題