变量的命名空间及作用域与局部作用域修改全局变量

1.命名空间和作用域
命名空间:变量名称与值的映射关系
作用域:变量作用的区域,即范围。

注意:class/def/模块会产生作用域;分支语句,循环语句,异常处理语句不会产生新的作用域。

2.作用域的类型区分
  • 命名空间:变量名称与值的映射关系
  • 作用域:变量作用的区域,范围。
  • 作用域分类型:
    • 局部作用域:
    • 嵌套作用域:
    • 全局作用域
    • 内置作用域:
类型表示方式简称
局部作用域 Local L
嵌套作用域 Enclosing E
全局作用域 Global G
内置作用域 Builtin B
# 全局变量
name = "小张"  # 全局作用域
def fun():
    # 嵌套作用域
    age = 20
    def fun02():
        print("xxxx")

# print内置作用域内
print(name)
# 说出变量的作用域
a = 1  # 全局作用域

def sum_num():
    c = 2  # 嵌套作用域

    def inner():
        d = 3  # 局部作用域
        print(d)
    print(c)

# 内置作用域
print(a)

3.LEGB法则

局部 > 嵌套 > 全局 > 内置


4.局部作用域变量的特点
  • 局部变量只能在局部访问
def fun():
    a = 10
    print(a)

fun()
  • 函数运行,开辟栈帧,在函数栈帧存活期间,访问局部变量,可以访问得到,如果函数栈帧销毁,则所有数据对象销毁。

5.局部作用域内修改全局变量
  • 需要在局部作用域内生命全局变量
5.1 可变类型
list01 = [1, 2, 3, 4, 5, 6]
def fun01():
    # global 声明
    list01.append(0)
    print(list01) # [1, 2, 3, 4, 5, 6, 0]

fun01()
print(list01)  # [1, 2, 3, 4, 5, 6, 0]
5.2 不可变类型
a = 10

def fun():
    # 在局部作用域修改全局变量
    # 兄弟,我这里声明的是一个全局变量
    global a  # 声明在局部作用域内创建一个全局变量
    a = 20
    print(a)  # 20

fun()
print(a)  # 20

当在局部作用域内修改全局变量时,如果全局变量为不可变类型,需要使用global 生命全局变量,才可以修改;如果全局变量为可变类型,可以直接修改。


6.总结
- 命名空间与作用域
- 作用域类型:LEGB
- LEGB法则
- 局部作用域内修改全局变量
- 可变类型:直接修改
- 不可变量:global
在局部修改全局的:global
在局部修改嵌套的:nonlocal
posted @ 2020-12-22 16:47  DoomLs  阅读(342)  评论(0)    收藏  举报