2016-12-16 17 views
0

はPythonで、次のコードを考えてみましょう:Pythonの変数はデフォルトでグローバルになっていますか?

a = 10 
def fun(): 
    print(a) 
fun() 

これはipythonノートブックで正常に動作し、出力が10です。

のC++でこのコードを考えてみましょう:

#include <iostream> 

void fun() { 
    std::cout << a << std::endl; 
} 

int main() { 
    int a = 10; 
    fun(); 
    return 0; 
} 

コンパイルすると、エラーがある:

compare-fun.cpp: In function ‘void fun()’: 
compare-fun.cpp:4:18: error: ‘a’ was not declared in this scope 
    std::cout << a << std::endl; 

私はPythonのコードについて混乱しています、なぜそれがaが定義されていない場合でも、aを呼び出すことができますfun

+11

そのC++コードは** Pythonコードと同等ではありません**。同等のPythonコードでは、同等のエラーが発生します。 –

+1

グローバル変数を使用できるようにしましたが、それらを変更するにはグローバル変数をグローバルにする必要があります。 –

+1

これをPythonでテストすることは難しくありません。globals()の 'a 'は' True'を返します。 –

答えて

9

あなたのCと同等のPythonコード++コードは次のよう実際にである:

Traceback (most recent call last): 
    File "test1.py", line 9, in <module> 
    main() 
    File "test1.py", line 6, in main 
    fun() 
    File "test1.py", line 2, in fun 
    print(a) 
NameError: global name 'a' is not defined 

同等のC++コードをあなたのPythonコードにこれを次のとおりです。

def fun(): 
    print(a) 

def main(): 
    a = 10 
    fun() 

if __name__ == '__main__': 
    main() 

これ、実行すると、以下の生成:

#include <iostream> 

int a = 10; 

void fun() { 
    std::cout << a << std::endl; 
} 

int main() { 
    fun(); 
    return 0; 
} 

これを実行すると、10が出力されます。

0

Python変数のスコープは、定義されている場所によって決まります。変数が関数またはクラスの外部で定義されている場合、変数はグローバルです。それ以外の場合は、globalと宣言されていない限りローカルです。このトピックのその他の情報:http://www.python-course.eu/python3_global_vs_local_variables.php

+1

関数またはクラスの外側。 –

1

これら2つのコードは同等ではありません。

Pythonでは、グローバルスコープの変数をC++では定義していません。 あなたはこれにC++でコードを変更した場合、それは同じように動作するはずです:Pythonのチェックhereスコープについての詳細を理解するために

#include <iostream> 
int a = 10; 
void fun() { 
    std::cout << a << std::endl; 
} 

int main() { 
    fun(); 
    return 0; 
} 

ファイルの本体で定義される変数は、グローバル変数 と呼ばれます。ファイル全体で表示され、そのファイルをインポートするファイル内には も表示されます。グローバル変数は、 が広範囲に及ぶ影響のために意図しない結果になることがあります。つまり、 は、ほとんど使用しない理由です。関数やクラスのように、グローバルに使用されることを意図した のオブジェクトだけが、グローバル名前空間に入れられる である必要があります。

関数内

か -

コンセプトは、変数を宣言することができる 3ヶ所が存在する範囲は、プログラムの領域と大まかに言えばあるC++

では非常に似ていますローカル変数と呼ばれるブロック

フォーマル パラメータと呼ばれる関数のパラメータの定義では。

グローバル変数と呼ばれるすべての機能の外です。 Pythonで

+0

Pythonコードを '__main__'に定義すると、おそらくコンパイラは同じエラーを出しますか?その部分を追加できますか? – buzhidao

4

すべてのオブジェクトが等しく扱われます。これは良い設計の決定であるか否かを議論することができますが、それはそれがどのように(そしていつもそうであるように)そうであるので、それを公理として受け入れましょう。

のpython サポートする必要があることをいくつかのコードを見てみましょう:

def bar(val): 
    return val + 6 

def foo(a): 
    return bar(a * 2) 

我々はbarが機能foo以内に使用可能になりたいが、それを可能にするために、我々は他のオブジェクトを許可する必要がありますすべてのオブジェクトを等しく扱いたいので、スコープ階層の上位レベルで定義されています。

def add_constant(constant): 
    def add(value): 
     return value + constant 
    return add 

add_3 = add_constant(3) 
assert add_3(6) == 9 
また

は、以下の誤りであることに注意してください(とある:

はまた、これはそれが閉鎖して面白いことをやって許す限り実際のpythonの非常に有用な特性であることに注意してくださいあなたが投稿したC++コードによく似ています):

def func(): 
    print a 

def main(): 
    a = 10 
    func() # NameError! 

if __name__ == '__main__': 
    main() 

そして、これはfuncのスコープは、funcのスコープがmainのスコープの子ではないため、aが定義されているスコープ(main)にアクセスできないためです。 aは、グローバルスコープで定義されていたので、

1

あなたのPythonの例では、機能fun()内部(コールしない)aを使用することができます。つまり、プログラム全体でaにアクセスできます。

しかし、イグナシオがすでにあなたにコメントの中で語っているように、あなたは2つの例が同等ではありません。あなたのC++の例では、aではなく、はグローバルスコープで定義されていますが、範囲はmain()です。つまり、void fun()は、aがどこに定義されているかを知る方法がないため、エラーがスローされます。

#include <iostream> 

int a = 10; 

void fun() { 
    std::cout << a << std::endl; 
} 

int main() { 
    fun(); 
    return 0; 
} 

あなたのPythonの例がありませんでしたが、あなたのC++の例では、エラーを投げた理由です:あなたがグローバルスコープでaを定義した場合、あなたのC++の例では、正常に動作します。スコープ内にaを定義した場合、void fun()は何も知らなかった。他の人がすでに示しているように、Pythonで元のC++の例に相当するコードを作成すると、エラーが発生します。

0

はグローバル変数であるため、手順で使用することができます。

関連する問題