1.在函数内定义的局部变量只在该函数内可见,当函数运行结束后,在其内部定义的所有局部变量将被自动删除而不可访问。在函数内部使用global定义的全局变量当函数结束以后任然存在并且可以访问。 2.如果在函数内部修改一个定义在函数外的变量值,必须使用global明确声明,否则会自动创建新的局部变量。在函数内部通过global关键字类声明或定义全局变量,分为两种情况: 方式一的理解: (1)一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将修改的结果反映到函数之外,可以在函数内用关键字global明确声明要使用已定义的同名全局变量。 (2)在函数内部直接使用global关键字将一个变量声明为全局变量,如果在函数外没有定义该全局变量,在调用这个函数之后,会自动创建新的全局变量。 方式二的理解: (1)在函数内如果只引用某个变量的值而没有为其赋新值,该变量为(隐式的)全局变量; (2)如果在函数内某条代码有为变量赋值的操作,该变量就被认为是(隐式的)局部变量,除非在函数内赋值操作 之前显示地用关键字global进行声明。 例如:局部变量和全局变量
>>> def demo():
#声明或创建全局变量,必须在使用x之前执行
global x
x=3#修改全局变量的值
y=4#局部变量
print(x,y)
>>> x=5#在函数外部定义了全局变量x
>>> demo()#本次调用修改了全局变量x
3 4
>>> x
3
>>> y#局部变量在函数运行结束之后自动删除,不再存在
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
y
NameError: name 'y' is not defined
>>> del x#删除了全局变量
>>> x
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
x
NameError: name 'x' is not defined
>>> demo()#本次调用了全局变量
3 4
注意:如果在某个作用域内有为变量赋值的操作,那么该变量将被认为是该作用域内的局部变量 。
>>> x=10#全局变量
>>> def demo():
#以下语句会发生异常,因为x变量现在还不存在
print(x)
x=x+1#赋值语句,x将被认为是该作用域内的局部变量
print(x)
>>> demo()
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
demo()
File "<pyshell#18>", line 2, in demo
print(x)
UnboundLocalError: local variable 'x' referenced before assignment
>>>
注意:如果局部变量与全局变量具有相同的名字,那么该局部变量会在自己的作用域内暂时隐藏同名的全局变量 。
>>> def demo():
x=3#创建了局部变量,并自动隐藏了同名的全局变量
print(x)
>>> x=5#创建全局变量
>>> x
5
>>> demo()
3
>>> x#函数调用结束之后,不影响全局变量x的值
5
>>>
以上内容来自《python程序设计基础》
|