我对局部变量和全局变量之间的区别感到困惑。我知道全局变量是在函数外部声明的,而局部变量是在函数中声明的。但是,我想知道是否是这样:
def func(l):
a = 0
n = len(l)
w = l[0]
while...
我的问题是,在我作为示例编写的函数中,我知道 a 是局部变量,但其他两个呢? 它们也是局部变量吗?
l
是您传递给函数的位置变量,因此w
w
是l[0]
的"副本">
要获得全局变量,您需要使用 global 关键字将该变量声明为全局变量。
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]
另请注意,总有比声明全局变量更好的方法来做某事,因为随着代码的扩展,它会变得更加混乱。
所有这些变量都被分配了值,并在本地范围内自动声明它们。所以它们是局部变量。
即使它们在全球范围之外被宣布,它们仍然是本地的。
除非您使用global
关键字,该关键字告诉解释器当前范围引用先前声明的全局,或者如果不存在具有相同名称的全局,则在全局上下文中创建一个新范围。
def func(l):
global n # n is declared in the global scope
a = 0
n = len(l)
w = l[0]
while...
func()
print(n)
函数中的所有变量都是局部变量,只能由该函数使用。 全局变量可由类中的所有函数使用。在您的函数中
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
我只是碰巧遇到了这个阅读,它为您提供了很多关于变量声明和范围的详细信息。
[Python Doc the Rule for Local and Global variables]:
在 Python 中,仅在函数内引用的变量是 隐式全局。如果变量在 函数的主体,除非明确,否则假定它是本地的 声明为全局。用你的例子来说明这一点:
使用您的示例来说明,在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:赋值前引用的局部变量"x">
但是现在,如果我们x
定义为全局的,那么我们可以自由地修改它,因为当我们调用x
引用同一变量并因此具有相同的内存地址时,Python 知道任何地方
x = 5
def func():
global x
x = x + 1
func()
print(x)
它打印出:6 作为x
的值
希望通过这个例子,你可以看到全局变量可以在程序的任何地方访问。而局部变量只能在其函数范围内访问。另外,请记住,即使全局变量可以在本地访问,也不能在本地进行修改。
局部变量 :当我们在函数内声明一个变量时,它就变成了一个局部变量。 全局变量:当我们在函数外声明一个变量时,它就变成了一个全局变量。
Python 程序了解局部变量与全局变量的差异
#same name for local and global variable.
a = 1 #this is global variable
def my_function():
a = 2 #this is local variable
print("a= ", a) #display local var
my_function()
print("a = ", a) #display global var.
此程序访问全局变量
a = 1 #This is global var
def my_function():
global a #This is global var.
print("global a= ", a) #display new value
a = 2 #modify global var value
print("modify a = ", a) #display a new value
my_function()
print("global a= ", a) #display modified value