📜  python中的全局(1)

📅  最后修改于: 2023-12-03 14:46:39.493000             🧑  作者: Mango

Python中的全局

在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规则:变量名的解析顺序。
    • L:local,局部作用域,即函数内部。
    • E:enclosing,嵌套函数的父函数作用域。
    • G:global,全局作用域,模块内部。
    • B:built-in,内置作用域,Python提供的内置函数或模块的内置作用域。
  • 局部作用域:函数内的作用域。
  • 全局作用域:模块内的作用域。
  • 内置作用域:Python内置的作用域,包含了内置函数和异常。

对于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关键字来显式声明,全局常量一般使用全大写变量名表示,在函数中访问全局变量需要注意变量作用域。