2017-08-11 76 views
2

我對局部變量和全局變量的區別感到困惑。我知道全局變量是在函數外聲明的,而局部是在函數中聲明的。不過,我想知道,如果它是這樣:局部變量和全局變量的區別

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

我的問題是,在我寫了作爲一個例子的功能,我知道,是一個局部變量,但對其他兩個是什麼?它們也是局部變量嗎?

+0

是的,它們是局部變量。您將無法在其他地方訪問'l'。它只是在你的函數範圍內對另一個對象的引用。 –

+0

是的,他們是。當心你對局部和全局變量思想的定義,你可能需要從基礎知識開始,並首先在互聯網上閱讀一些Python基礎知識。 –

+0

在函數中添加print(locals())'來檢查它。在你的例子中,它應該包含一個,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 

通知x怎麼現在改了,但y是不是?

注意lists是特殊的,因爲你不需要申報global關鍵字添加或刪除它們:

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 

A,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先手提交到內存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

但是現在如果我們定義x作爲全球那麼我們可以隨意修改它,因爲Python知道任何地方,我們稱之爲x是引用相同的v良莠不齊,因此相同的內存地址

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

func()  
print(x) 

它打印出:6通過這個例子,你看到全局變量可以在任何地方在程序中訪問的x

希望的值。而局部變量只能在其功能範圍內訪問。另外,請記住,即使全局變量可以在本地訪問,它本身不能本地修改。