2017-08-11 80 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

希望的值。而局部变量只能在其功能范围内访问。另外,请记住,即使全局变量可以在本地访问,它本身不能本地修改。