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 NIO中的缓冲区Buffer(二)创建/复制缓冲区
    Java NIO中的缓冲区Buffer(一)缓冲区基础
    Java中的反射
    Java SE 9(JDK9)环境安装及交互式编程环境Jshell使用示例
    Spring Data JPA例子[基于Spring Boot、Mysql]
    Spring Session
    Spring Data Redis示例
    Spring IO Platform简介及示例
    使用Spring Boot开发 “Hello World” Web应用
    2017/01/13,今天正好是开通博客园一周年,谈谈自己的一些想法
  • 原文地址:https://www.cnblogs.com/boye169/p/13443403.html
Copyright © 2011-2022 走看看