精华内容
下载资源
问答
  • python 变量作用域

    2019-06-27 21:45:43
    python 变量作用域 1、在函数内部定义的变量称为“局部变量”,只作用于函数内部,函数外无法调用。 2、在函数外定义的变量称为“全局变量”,作用于全局。 3、在局部想要更改全局变量,需要使用global 4、在内层...

    python 变量作用域

    1、在函数内部定义的变量称为“局部变量”,只作用于函数内部,函数外无法调用。
    2、在函数外定义的变量称为“全局变量”,作用于全局。
    3、在局部想要更改全局变量,需要使用global
    4、在内层函数想要更改外层函数变量,需要使用nonlocal

    一、global用法

    # 例如
    name = "YY"  # 全局变量
    
    
    def f1():
        global name  # 声明name为全局变量
        name = "JJ"  # 直接修改全局变量
        print(name)
    
    
    f1()  # JJ
    print(name)  # JJ
    
    

    nonlocal用法

    # 例如
    def f1():
        age = 18
        
        def f2():
            nonlocal age
            age = 20  # 调用f2后将直接修改外层变量age
            print(age)  # 打印内层变量 20
        f2()  # 调用f2函数
        print(age)  # 打印外层变量 20
    
    
    f1() 
    
    展开全文
  • Python 变量作用域

    2018-05-11 10:54:00
    Python 变量作用域 变量作用域LEGB 1、变量的作用域 在Python程序中创建、改变或查找变量名时,都是在一个保存变量名的空间(命名空间)中进行的,我们称这个命名空间为作用域。Python的作用域是静态的,在源代码中...

    Python 变量作用域

    变量作用域LEGB
    1、变量的作用域
    在Python程序中创建、改变或查找变量名时,都是在一个保存变量名的空间(命名空间)中进行的,我们称这个命名空间为作用域。Python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围,即Python变量的作用域由变量所在源代码中的位置决定。

    2、高级语言对数据类型的使用过程
    一般的高级语言在使用变量时,都会有下面4个过程,当然不同的语言也会有着区别:

    • 1.声明变量:让编译器知道由这个变量的存在;
    • 2.定义变量:为不同数据类型的变量分配内存空间;
    • 3.初始化:赋值,填充分配好的内存空间;
    • 4.引用:通过引用对象(变量名)来调用内存对象(内存数据);

    3、作用域的产生
    就作用域而言,Python与C有着很大的区别,在Python中并不是所有的语句块都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。如下代码:

    def func():
        variable = 100
        print(variable)
    
    print(variables)        # NameError: name 'variables' is not defined,在pycharm中就会自动报错

    在作用域中定义的变量,一般只在作用域中有效。需要注意的是:在if-elif-else、for-else、while、try-except/try-finally等关键字的语句块中并不会产生作用域,如下代码:

    if True:
        variable = 100
        print(variable)     # 100
    
    print("*"*12)       # ************
    print(variable)     # 100

    所以,可以看到,虽然在if语句中定义的variable变量,但是在if语句外仍然能够使用。

    4、作用域的类型:
    在Python中,使用一个变量时并不严格要求预先声明它,但是在真正使用它之前,他必须被绑定到某个内存对象(被定义、赋值);这种变量名的绑定将在当前作用域中引入新的变量,同事屏蔽外层作用域中的同名变量。
    L(local)局部变量作用域
    局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少用全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
    注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。

    E(enclosing)嵌套作用域
    E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域,主要是为了实现Python的闭包,而增加的实现。

    G(global)全局作用域
    即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部来看,模块的全局变量就是一个模块对象的属性。
    注意:全局作用域的作用范围仅限于单个模块文件内。

    B(built-in)内置作用域
    系统内固定模块里定义的变量,如与定义在builtin模块内的变量。

    5、变量名解析LEGB法则
    搜索变量名的优先级:局部作用域-> 嵌套作用域-> 全局作用域-> 内置作用域
    LEGB法则:当在函数中使用未确定的变量名时,Python会按照优先级依次搜索4个作用域,以此来确定该变量名的意义。首先搜索局部作用域(L),之后是上一层嵌套结构中def或lambda函数的嵌套作用域(E),之后是全局作用域(G),最后是内置作用域(B)。按照这个查找原则,在第一处找到的地方停止,如果没找到,则会抛出NameError异常。如下实例:

    def func():
        variable = 300
        print(variable)     # 300
    
    
    variable = 100
    func()
    print(variable)     # 100
    variable = 100
    
    
    def test_scope():
        print(variable)     # variable是test_scope()的局部变量,但是在打印时并没有绑定内存对象,所以在pycharm中就会报错
        variable = 200
    
    
    test_scope()
    print(variable)

    上面的例子会产生错误,因为在执行程序的时的预编译能够在test_scope()中找到局部变量variable(对variable进行了赋值)。在局部作用域找到了变量名,所以不会升级到嵌套作用域去寻找,但是在使用print()将变量variable打印时,局部变量并没有绑定到一个内存对象(没有定义和初始化,即没有赋值)。本质上还是Python调用变量时遵循的LEGB法则和Python解释器的编译原理,决定了这个错误的发生。所以,在调用一个变量之前,需要为该变量赋值(绑定一个内存对象)。
    注意:为什么在这个例子中触发的错误是"UnboundLocalError: local variable 'variable' referenced before assignment",而不是"NameError:name ‘variable’ is not defined"。这是因为变量variable不是在全局作用域。Python中的模块代码在执行前,并不会经过预编译,但是模块内的函数体代码在运行前会经过预编译,因此不管变量名的绑定发生在作用域的哪个位置,都能被编译器知道。Python虽然是一个静态作用域语言,但变量名查找是动态发生的,直到在程序运行时,才会发现作用域方面的问题。

    转载于:https://www.cnblogs.com/love9527/p/9022313.html

    展开全文
  • python变量作用域

    2019-02-12 18:39:52
    python变量作用域 转自: https://blog.csdn.net/bylhjcsmmd/article/details/76372110 python的作用域并不是哪里都能访问的,类似于Java,分全局和局部,并且局部和全局互不受影响,除非通过特殊手段,python变量的...

    python变量作用域

    转自: https://blog.csdn.net/bylhjcsmmd/article/details/76372110

    python的作用域并不是哪里都能访问的,类似于Java,分全局和局部,并且局部和全局互不受影响,除非通过特殊手段,python变量的作用域大概分为以下四类:

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

    遵循LEGB原则:以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

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

    在python中,模块(module),类(class)、函数(def、lambda)会产生新的作用域,其他代码块是不会产生作用域的,也就是说,类似条件判断(if……else)、循环语句(for x in data)、异常捕捉(try…except)等的变量是可以全局使用的

        dataList = [1, 2, 3, 4]
        for data in dataList:
            a = 1   #for循环中的变量a
            b = data + a
        
        print(a) #在函数外也可视为全局变量使用
    

    全局变量是指在函数外的变量,可以在程序全局使用,局部变量是指定义在函数内的变量,只能在函数内被声明使用

    若内部作用域的想要修改外部作用域的变量,就要使用global关键字:参考一下代码

    1、未使用global关键字

        
        a = 1
        
        
        def demo():
            # IDE提示a = 123:This inspection detects shadowing names defined in outer scopes
            # 大概意思是给变量取的这个名字,可能会冲突,它是函数外部的变量
            a = 123
            print(a)
        
        demo()
        
        print(a)
        
    
    运行结果是
    
    123
    1
    全局变量a的值还是1,没有被改变
    

    2、使用global关键字

        a = 1
        
        
        def demo():
            global a
            a = 123
            print(a)
        
        demo()
        
        print(a)
    
    运行结果是
    123
    123
    全局变量a的值被修改
    

    nonlocal 关键字的使用方法和global关键字类似,修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量

        def outer():
            num = 10
            def inner():
                nonlocal num   # nonlocal关键字声明
                num = 100
                print(num)
            inner()
            print(num)
        outer()
    
    运行结果为
    100
    100
    闭包函数外的变量num值被修改
    
    展开全文
  • Python变量作用域

    2019-09-15 01:32:23
    Python 变量,根据范围分为全局变量和局部变量。 ...Python作用域一共有4中,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Global) 全局作用域 B (Built-i...

    Python 变量,根据范围分为全局变量和局部变量。

        通常全局变量,变量名字母全部大写,局部变量名遵循编码规范,在类或者过程内部引用全局变量需要增加globals 关键字,否则系统认为是局部变量。

     

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

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

    编译器查找变量规则: L –> E –> G –>B

    局部作用域会覆盖全局作用域,但不会影响全局作用域。

    闭包函数中尽量不要修改外部变量值,使用nonlocal关键字可以在闭包中引用外部变量。

     

    globals() 和 locals() 提供了基于字典的访问全局和局部变量的方式

    展开全文
  • 变量作用域一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:全局变量局部...
  • 在本篇文章里小编给大家整理的是关于Python变量作用域的相关知识点内容,需要的朋友们可以学习下。
  • 主要介绍了Python 变量作用域的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,531
精华内容 25,012
关键字:

python变量作用域

python 订阅