2017-08-11 9 views
2

ローカル変数とグローバル変数の違いは混乱しています。グローバル変数は関数の外部で宣言され、ローカルは関数で宣言されることはわかっています。ローカル変数とグローバル変数の違い

def func(l): 
    a = 0 
    n = len(l) 
    w = l[0] 
    while... 

私の質問は、私が例として書いた関数の中で、私は他の2程度のローカル変数が、何であることを知っている:それはようにある場合しかし、私は思ったんだけど?それらもローカル変数ですか?

+0

はい、ローカル変数です。他の場所では 'l'にアクセスすることはできません。それはあなたの関数の範囲内の別のオブジェクトへの参照に過ぎません。 –

+0

はい、そうです。ローカル変数とグローバル変数についてのあなたの定義に注意してください。まず基本から出発して、いくつかのPythonの基礎についてインターネットを読んでみてください。 –

+0

'print(locals())'を関数に追加してチェックアウトします。あなたの例では、a、n、w、lが含まれているはずです。また、 'l'と' w [0] 'は両方ともあなたの関数の範囲外で作成されたオブジェクトを参照します。これは、 'l'と' w'がグローバルであることを意味しません**。 – Unatiel

答えて

1

これらの変数にはすべて値が割り当てられ、それらは自動的にローカルスコープで宣言されます。したがって、それらはローカル変数です。

グローバルスコープ内で外部に宣言されたとしても、それらは引き続きローカルになります。

globalキーワードを使用しないと、現在のスコープが以前に宣言されたグローバルを参照するか、同じ名前のものが存在しない場合はグローバルコンテキストに新しいグローバルスコープが作成されます。

​​
1

lあなたが関数に渡された場所の変数であり、そのためw以来wであるあなたが使用してグローバルとして変数を宣言する必要がグローバル変数を持つためにl[0]

の「コピー」でありますグローバルキーワード。

x = 1 
y = 2 
def func(l): 
    global x 
    x = 4 
    l = 5 
    print("x is {0}, y is {1}".format(x,l)) 

func(y) 
print("x is {0}, y is {1}".format(x,y)) 

戻り値:

x is 4, y is 5 
x is 4, y is 2 

お知らせ今変更したがyではないですかx?あなたが追加したり、そこから削除するglobalキーワードを宣言する必要はありませんので、listsが特別であることを

注:

x = [] 

def func(): 
    x.append(3) 
    print("x is {0}".format(x)) 

func() 
print("x is {0}".format(x)) 

戻り値:リストへ

x is [3] 
x is [3] 

しかし言及それらがそのコピーであるため、グローバルではありません:

x = [3] 
y = 1 

def func(): 
    y = x[0] 
    print("y is {0}".format(y)) 

func() 
print("y is {0}".format(y)) 

戻り値:


y is 3 
y is 1 
はまたリストした変数の再割り当ては、グローバルではありません。

x = [3] 

def func(): 
    x = [2] 
    print("x is {0}".format(x)) 

func() 
print("x is {0}".format(x)) 

戻り値:

x is [2] 
x is [3] 

また、グローバル変数を宣言するよりも何かをするより良い方法があることにも注意してください。なぜなら、あなたのコードのスケールがより厄介になるからです。

1

関数内のすべての変数はローカルであり、その関数でのみ使用できます。グローバル変数は、クラス内のすべての関数で使用できます。あなたの関数で

def func(l): 
    a = 0 
    n = len(l) 
    w = l[0] 
    while... 
>>>a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'a' is not defined 

、N、W、Lはfunc範囲の外に使用できません。あなたはこのような何か...

a = 0 
def func(l): 
    n = len(l) 
    w = l[0] 
    while... 

>>>a 
0 

をした場合、私はちょうど変数の宣言とスコープの詳細の多くを提供しますthis readに遭遇することが起こりました。

1

[Python Docローカルおよびグローバル変数]のルール:

In Python, variables that are only referenced inside a function are implicitly global. If a variable is assigned a value anywhere within the function’s body, it’s assumed to be a local unless explicitly declared as global. illustrate this with your example:

は説明するためにあなたの例を使用して、func内で宣言されているすべての変数はローカル変数です。関数の外部で宣言された値ですらあります。変数xのように親関数はありませんが、実際にはグローバル変数ではありません。 xちょうど私たちは、あなたがエラーになるだろうxローカル変数を変更しようとfunc

x = 5 #actually local 

def func(l): 
    a = 0 
    n = len(l) 
    w = l[0] 
    print(x) # x is local we call call it, use it to iterate but thats is pretty much it 

呼び出される前にメモリへのコミットを取得:今、私たちはxを定義した場合

x = 5 
def func(l): 
    a = 0 
    n = len(l) 
    w = l[0] 
    x = x + 1 # can't do this because we are referning a variable before the funtion scope. and `x` is not global 

UnboundLocalError: local variable 'x' referenced before assignment

が、グローバルとしてを呼び出すと、Pythonがどこでも知っているように自由に変更できますxは同じv ariableしたがって、同じメモリアドレス

x = 5 
def func(): 
    global x 
    x = x + 1 

func()  
print(x) 

それが出て印刷します。6をx

希望の値のためにこの例を使用すると、グローバル変数は、プログラム内のどこにもアクセスできることを参照してください。一方、ローカル変数はその関数スコープ内でしかアクセスできません。また、グローバル変数にローカルでアクセスすることはできますが、ローカル変数を本質的に変更することはできません。

関連する問題