📅  最后修改于: 2023-12-03 14:46:39.493000             🧑  作者: Mango
在Python中,全局指的是程序中定义的可以在任何地方都可以访问的变量、常量、函数以及类。这些全局元素可以在模块中定义,在模块外定义,在函数内定义等。本文将介绍全局变量、全局常量、全局函数、全局类以及在不同作用域定义变量时可能遇到的问题。
全局变量是在模块中定义的可以在任何地方访问的变量,可以通过global
关键字来显式声明一个变量为全局变量。例如:
x = 10 # 全局变量
def func():
global x
x = 20
print(x)
func() # 输出20
print(x) # 输出20
在func()
函数中,通过global
关键字声明x
是全局变量,因此func()
函数中的x = 20
语句会改变全局变量x
的值。最后打印x
的值是20。
在Python中没有常量的概念,但是可以通过全大写的变量名来表示常量,表示这个变量的值在程序生命周期内不会被改变,并且可以在任何地方访问。例如:
PI = 3.14159265358979323846
在模块中定义一个全局常量PI
,表示圆周率的近似值。在程序的其它地方可以直接使用PI
变量,而且其值不可修改。
在模块中定义的函数,可以在模块的任何地方调用。例如:
def add(a, b):
return a + b
在模块中定义了add()
函数,可以在其它任何地方调用这个函数,例如:
from mymodule import add
print(add(1, 2)) # 输出3
这里通过import
语句来导入mymodule
模块中的add()
函数,然后调用这个函数。
在Python中定义的类也可以是全局的,可以在模块的任何地方使用。例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
在这个例子中,定义了一个Person
类,可以在其它任何地方使用这个类,例如:
from mymodule import Person
p = Person('Tom', 18)
print(p.name) # 输出'Tom'
print(p.age) # 输出18
与全局函数一样,通过import
语句来导入mymodule
模块中的Person
类,然后使用这个类创建对象并调用其属性。
Python中有4种作用域,分别为:
对于LEGB规则,当Python查找一个变量时,会按照LEGB的顺序从局部作用域开始进行查找,如果在局部作用域中找到了变量,则直接返回这个变量的值,如果在局部作用域中没有找到,则继续在该函数的嵌套作用域中查找,依次往上,直到找到变量或者找到全局作用域。
如果在全局作用域中也没有找到变量,则在内置作用域中查找这个变量,如果还是没有找到,则会抛出NameError
异常。
例如:
x = 10 # 全局变量
def func():
x = 20 # 局部变量
def inner_func():
print(x)
inner_func()
func() # 输出20
在这个例子中,func()
函数中有一个局部变量x
,值为20,inner_func()
函数中没有定义x
,因此按照LEGB规则,在内层函数中查找变量时,会先到自己的局部作用域中查找,然后到外层嵌套函数的作用域中查找,最后到全局作用域中查找,找到了全局变量x
的值为10。最后inner_func()
函数打印的x
的值是10。
在Python中,全局指的是可以在任何地方访问的变量、常量、函数以及类,可以在模块中定义、在函数内定义等。全局变量可以使用global
关键字来显式声明,全局常量一般使用全大写变量名表示,在函数中访问全局变量需要注意变量作用域。