python作用域

作用域

  1. 从空间角度研究函数

    全局名称空间: py文件运行时开辟的,存放的是执行的py文件(除去函数内部)的所有的变量与值(地址)的对应关系,整个py文件结束之后,才会消失。

    临时(局部)名称空间: 函数执行时,在内存中临时开辟的一个空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失。

    内置名称空间:input,print,内置函数等。

  2. 取值顺序加载顺序

    加载顺序:上面这三个空间,谁先加载到内存。

    内置名称空间 ----》 全局名称空间 ----》 (函数执行时)临时名称空间

    取值顺序:(就近原则)

  3. 作用域

    全局作用域:全局名称空间,内置名称空间。

    局部作用域:局部名称空间。

关键字:global,nonlocal

# count = 0
#
# def func():
#     count += 1
# func()
#报错
# UnboundLocalError: local variable 'count' referenced before assignment
# 解释器认为:如果你在局部作用域对一个变量进行修改了,
# 你在局部作用域已经定义好这个变量了。

global

  1. 可以在局部作用域声明一个全局变量。

    # 这是剪切
    # def func():
    #	在全局定义一个变量name
    #     global name
    #     name = 1
    #
    #     print(globals())
    #     # print(locals())
    #     name += 1
    #     print(globals())
    #
    #
    # func()
    # # print(name)
    # print(globals())
    
  2. 可以修改全局变量。

    # count = 0
    #
    # def func():
    #     global count
    #     count += 1
    #
    # print(count)
    # func()
    # print(count)
    

nonlocal

  1. 不能操作全局变量。
  2. 可以对父级作用域的变量进行修改,并且在当前作用域创建(复制)一份此变量。
# 这是复制
# def func():
#     count = 0
#     def inner():
#         nonlocal count
#         count += 1
#         print(count)
#         print(locals())
#     inner()
#     print(locals())
# func()
# UnboundLocalError: local variable 'count' referenced before assignment
# 解释器认为:如果你在局部作用域对一个变量进行修改了,
# 你在局部作用域已经定义好这个变量了。

原文地址:https://www.cnblogs.com/nieice/p/11083387.html