Python3笔记029 - 6.4 变量作用域

第6章 函数

  • 6.1 函数的定义和调用
  • 6.2 参数传递
  • 6.3 函数返回值
  • 6.4 变量作用域
  • 6.5 匿名函数(lambda)
  • 6.6 递归函数
  • 6.7 迭代器
  • 6.8 生成器
  • 6.9 装饰器

6.4 变量作用域

作用域指的是变量的有效范围,根据变量的有效范围将变量分为局部变量和全局变量。

6.4.1、局部变量

局部变量是指在函数内部定义并使用的变量,它只在函数内部有效,一旦执行完毕,局部变量就会被回收,无法访问。

6.4.2、全局变量

全局变量为能够作用于函数内外的变量。

1、如果一个变量,在函数外定义,那么不仅函数外可以访问到,在函数内也可以访问到。

当局部变量与全局变量重名时,对函数体的变量进行赋值后,不影响函数体外的变量。

2、在函数体内定义,并且使用global关键字修饰,该变量就是全局变量。在函数体外也可以访问到该变量,并且在函数体内外还可以对其进行修改。

尽管python允许全局变量和局部变量重名,但是在实际开发时,不建议这么做,因为这样容易让代码混乱,很难分清哪些是全局变量,哪些是局部变量。

# 块级别,变量是没有作用范围的,相当于全局变量
## if语句
if True:
    color = "绿色"
print(color)
output:
绿色
## for语句
list1 = []
for i in range(3):
    list1.append(i)
print(i)
output:
2
# 函数级别,变量是有作用范围的
def function_print(): # 传递不定长参数,即参数个数不固定
    week = "星期三"

print(week)
output:
NameError: name 'week' is not defined
# 类级别,变量是有作用范围的
class Date1():
    day = 1
    week = "星期三"

print(day)
output:
NameError: name 'day' is not defined

从程序运行结果来看,函数级别、类级别中的变量有作用域,语句块级别的变量没有作用域。

Python的作用域一共有4层,分别是:

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内建作用域

Python以L –> E –> G –>B的规则查找变量,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,最后去内建中找。如果这样还找不到,那就提示变量不存在的错误。

MIN = 1  # 全局变量
MAX = 8  # 全局变量
print(f"MIN={MIN},MAX={MAX}")


def func1():
    global MIN  # 使用global关键字 修改全局变量
    MIN += 1
    a = 5  # 局部变量
    b = 1
    print(f"MIN={MIN},a={a},b={b}")

    def func2():
        MAX = 9  # 局部变量与全局变量同名,局部变量会覆盖全局变量
        nonlocal a  # 使用nonlocal关键字 修改外部函数的变量
        a += 1
        b = 2  # 内部函数变量与外部函数变量同名,覆盖
        print(f"MIN={MIN},MAX={MAX},a={a},b={b}")

    func2()  # 内部函数被外部函数调用


func1()
print(f"MIN={MIN},MAX={MAX}")
posted @ 2020-07-13 09:42  测试工匠麻辣烫  阅读(182)  评论(0编辑  收藏  举报