美文网首页程序员
Python干货-变量的作用域

Python干货-变量的作用域

作者: 东南有大树 | 来源:发表于2018-10-29 13:27 被阅读11次

在Python程序设计中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的

变量作用域

变量的作用域一共分4种:

  1. 局部作用域(Local)
  2. 闭包函数外的函数中(Enclosing)
  3. 全局作用域(Global)
  4. 内建作用域(Built-in)

变量的访问顺序为:

先查找局部作用域,如果没有则在装饰函数外的函数中查找,如果没有则在全局作用域查找,如果没有则在内建作用域查找

示例:

x = int(2.9)  # 内建作用域,内建作用域变量一般可以在python的库中找到

g_count = 0  # 全局作用域 
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

在Python程序设计中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其他的代码块(如 if/elif/else/、tyr/except、for/while等)不会引用新的作用域,也就是说,这些语句内定义的变量,在外部也可以访问

示例:

if True:
    m1 = 'if中变量'
else:
    m2 = 'esle中变量'

# 在外部访问
print(m1)
if中变量
def test():
    test_value = '函数中变量'

# 在外部访问
print(test_vale)
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-7-9b9316eb7ed1> in <module>()
      3 
      4 # 在外部访问
----> 5 print(test_vale)


NameError: name 'test_vale' is not defined

区分全局变量与局部变量

# 定义在函数外在的变量为全局变量
total = 0 

def sum(arg1, arg2):
    # 定义在函数内部的变量为局部变量
    total = arg1 + arg2
    print('函数内部是局部变量', total)
    return total

# 调用sum函数
sum(50, 80)
print('函数外部是全局变量', total)
函数内部是局部变量 130
函数外部是全局变量 0

可以看出,虽然全局变量与局部变量的名称一样,但它们可被访问的空间是不一样的。如果在内部定义一个与外部全局变量一样名称的变量,会优先操作局部变量

global 和 nonlocal 关键字

这两个关键字可以在内部作用域修改外部作用域的变量,global适用于操作全局变量,noncloal适用于闭包外的函数中的变量

示例:

num = 1

def fun1():
    global num  # 使用 global 关键字声明,来使用全局变量num
    print('在内部打印外部全局变量 num', num)
    num = 123  # 重新为外部变量num赋值
    print('在内部改变外部全局变量num的值', num)
    
print('未调用函数前num的值', num)
fun1()
print('调用函数后num的值', num)
未调用函数前num的值 1
在内部打印外部全局变量 num 1
在内部改变外部全局变量num的值 123
调用函数后num的值 123
def outer():
    num = 10
    def inner():
        nonlocal num  # 声明nonlocal关键字来使用闭包外部的变量
        print('在嵌套函数中使用num的值', num)
        num = 100  # 改变num的值
        print('嵌套函数中改变num的值', num)
    # 调用嵌套函数
    inner()
    print('调用嵌套函数后num的值', num)
outer()
在嵌套函数中使用num的值 10
嵌套函数中改变num的值 100
调用嵌套函数后num的值 100

相关文章

  • #抬抬小手学Python# Python 之作用域下的 glob

    global 和 nonlocal 作用域 该部分内容涉及 Python 变量作用域相关知识,变量作用域指的是变量...

  • python学习笔记|nonlocal/global

    python中引用变量的顺序为:当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变...

  • Python干货-变量的作用域

    在Python程序设计中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的 变量作用域...

  • 变量作用域

    0. 命名空间 变量作用域1. 变量作用范围:可操作范围2. Python 是静态作用域,变量的作用域源于它在代码...

  • python的作用域

    前言  作用域是程序运行时变量可被访问的范围。 作用域  python变量的作用域很简单,就是LEGB:变量名引用...

  • Python基础重构-1.2数据类型

    1、变量和常量 变量作用域 Python的作用域一共有4种,分别是:L (Local) 局部作用域E (Enclo...

  • Python基础(十四): 函数作用域

    一、基本概念 1、变量的作用域 变量的作用范围: 可操作范围 Python是静态作用域, 也就是说在Python中...

  • Python的闭包与装饰器

    一、python的函数作用域 python的函数作用域的含义,简而言之,即函数执行时变量所在的作用域。在pytho...

  • Python装饰器与闭包!

    闭包是Python装饰器的基础。要理解闭包,先要了解Python中的变量作用域规则。 变量作用域规则 首先,在函数...

  • Python变量作用域范围

    关键词: python;作用域; Variable Scope; 1、Python中能够改变变量作用域的代码段是d...

网友评论

    本文标题:Python干货-变量的作用域

    本文链接:https://www.haomeiwen.com/subject/kadbtqtx.html