zoukankan      html  css  js  c++  java
  • 《python-变量作用域》

    1.变量作用域

    • 一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量。
    • 全局变量所有作用域都可读,局部变量只能在本函数可读
    • 函数在读取变量时,优先读取函数本身自有的局部变量,再去读全局变量

    2.变量名解析LEGB法则

    搜索变量名的优先级:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域

    L(local)局部作用域
    局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
    注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。

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

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

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

    3.global关键字

    用来在函数或其他局部作用域中使用全局变量

    • 但是如果不修改全局变量也可以不使用global关键字
    • 声明全局变量,如果在局部要对全局变量修改,需要在局部也要先声明该全局变量
    • 在局部如果不声明全局变量,并且不修改全局变量。则可以正常使用全局变量
     1 #!/usr/bin/env python
     2 #-*-  coding:utf-8 -*-
     3 
     4 NUM=90
     5 String= "hello"
     6 AList = [1,2,3]
     7 
     8 def test1():
     9     AList.append("t1")
    10     global NUM
    11     global String
    12     NUM = 9
    13     String = "test1"
    14     
    15 def test2():
    16     AList.append("t2")
    17     NUM = 90
    18     String = "test2"
    19     
    20 test1()
    21 print(NUM)
    22 print(AList)
    23 print(String)
    24 print("===============")
    25 test2()
    26 print(NUM)
    27 print(AList)
    28 print(String)

    result:

    4.nonlocal关键字

    用来在函数或其他作用域中使用外层(非全局)变量 

     1 def func(a):
     2     d= 0
     3     def line(b):
     4         nonlocal d
     5         d += 1
     6         return d * a - b
     7     return line
     8 f = func(3)
     9 
    10 print(f(2)) # 1
    11 print(f(4)) # 2

    5.global与nonlocal区别

    • 两者的功能不同。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误
    • 两者使用的范围不同。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量
  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/boye169/p/13443403.html
Copyright © 2011-2022 走看看