一 LEGB

什么是LEGB?

L:local 函数内部作用域
E:enclosing 函数内部与内嵌函数之间
G:global 全局作用域
B:build-in 内置作用域

顺序是什么?

跟名字一样,Python在函数里面的查找分为4种,称之为LEGB,也正是按照这种顺序来查找的。

首先,是local,先查找函数内部
然后,是enclosing,再查找函数内部与嵌入函数之间(是指在函数内部再次定义一个函数)
其次,是global,查找全局
最后,是build-in,内置作用域

实例(Python3.0+):

name = 'wangyw'

def foo():
name = 'maoj'
def bar():
print(name) # 打印的name时就用到函数作用域,它会找本函数中是否存在此变量,如不存在找上级函数中是否存在,逐级上寻找变量,直到找到变量位置。
return bar foo()
a = foo() # 把执行foo()函数得到的return返回值赋值给a,也就是把返回值bar赋值给a
print(a) # 此时打印的是a(bar)的内存地址
a() # 相当于执行bar()

二 函数变量

我们通常把定义在函数外的变量成为全局变量,定义在函数内的变量称为局部变量,顾名思义,全局变量的作用域是整个代码段,局部变量的作用域就只是在它所属的代码段,变量只在它的作用域里有效。

通过实例,我们可以进一步理解下,全局和局部的概念。

实例1(Python3.0+):

count = 10  # 全局变量

def print_local():
count = 5 # 局部变量,这个count覆盖了全局变量count,这2个是不同的变量。
print(count) def print_global():
print(count) # 这里的count是最上面的全局变量噢 print_local()
print_global() """
运行结果:
>> 5
>> 10
"""

global

  • 函数中引用修改全局变量

实例(Python3.0+):

count = 10
def foo():
global count # 告知程序count是全局变量
print(count)
count = 7 # 修改全局变量count的值
print(count) foo() """
运行结果:
>> 10
>> 7
"""

nonlocal

  • 引用修改父级局部变量

实例(Python3.0+):

count = 100

def foo():
count = 10 def inter():
nonlocal count
# 引用父级局部变量
print(count)
count = 20
print(count)
inter()
print(count) foo() """
运行结果:
>> 10
>> 20
>> 20
"""

小结:

  • 变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>Python内置作用域。
  • 只有模块、类以及函数才能引用新作用域。
  • 对于一个变量,内部作用域声明会覆盖外部变量,不直接声明,就会使用外部作用域的变量。
  • 内部作用域要修改外部作用域变量的值时,全局变量要使用golbal关键字,嵌套作用域变量要使用nonlocal关键字,nonlocal是Python3新增的关键字,有了这个关键字,就能完美的实现闭包了。
  • 如果函数的内容中无global关键字,优先读取局部变量;如无局部变量,则读取全局变量,但无法对全局变量进行重新赋值(name="ffff"),对于可变类型(列表,字典),可以对内部元素进行操作。

错误实例1:

name = "lvcm"

def count():
print(name)
name = "wangyw"
print(name) count() """
运行结果:
>> UnboundLocalError: local variable 'name' referenced before assignment
"""

错误实例1,函数中没有使用global关键字,print(name),读取的是全局变量name,不能对全局变量name进行修改,但如果name是可变类型(字典,列表)时,可以对全局变量进行修改操作。

实例:

name = ['zhubj','age']

def count():
print(name)
name.append("wangyw")
# 列表的所有方法都可以使用
print(name) count()
print(name) """
运行结果:
>>> ['zhubj', 'age']
>>> ['zhubj', 'age', 'wangyw']
>>> ['zhubj', 'age', 'wangyw']
"""

错误实例2:

name = ['name','age']

def count():
name = "wangyw"
global name
print(name) count() """
运行结果:
>>> SyntaxWarning: name 'name' is assigned to before global declaration global name 备注:函数中使用global声明全局变量时,global之前不能定义与全局变量同名的局部变量,否则会报错。为了避免报错,代码中全局变量使用大写,局部变量使用小写
"""

 

Python3 函数作用域的更多相关文章

  1. python3函数

    一.python3函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.可以自己创建函数,这被叫做用户自定义函数. 1.定义函数规则 函 ...

  2. python015 Python3 函数

    Python3 函数函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  3. Python函数作用域和匿名函数

    匿名函数的定义 全局变量和局部变量的概念 global(全局变量)和 nonlocal(局部变量) 闭包.递归.回调 匿名函数 匿名函数  lambda 语法规则:lambda   参数 : 表达式 ...

  4. day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数

    20180729    补充部分代码 20180727    上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...

  5. 07 . Python3函数

    Python3函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().我们可以直接调用 ...

  6. 07.python函数作用域global、nonlocal、LEGB

    函数作用域 作用域 一个标识符的课件范围,这就是标识符的作用域,一般常说的是变量的作用域 def foo():    x = 100 print(x) # 可以访问到吗 上例中x不可以访问到,会抛出异 ...

  7. 深入理解javascript函数定义与函数作用域

    最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...

  8. js 碎片整理(变量声明,函数作用域)

    1.变量声明: 在非严格模式下,函数可以对未声明的变量赋值,而这样赋值的结果就是该变量就会变成全局变量. (function(){ var a = 1; })(); console.log(a) ; ...

  9. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

随机推荐

  1. form组件-字段

    Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML 1.Django内置字段如下: Field required=True, 是否 ...

  2. Navicat Premium 12 激活

    链接:https://pan.baidu.com/s/1R4WB2JjKd0UYnN00CpUPSA 提取码:e3wy (破解工具及软件安装包) 破解流程:https://www.jianshu.co ...

  3. jdk 配置

    JDK (绿色版)      此次安装的 JDK 版本为  1.8.0_77 步骤一: 拷贝 JDK(350M左右)到电脑 步骤二: 配置环境变量  JAVA_HOME  , PATH  ,  CLA ...

  4. jquery实现漂亮的轮播图

    今天工作中要用到一个轮播功能,在网上找了一些,觉得有些过于繁琐,于是自己动手写了一个,效果如图: 代码如下: <!DOCTYPE html> <html lang="en& ...

  5. redis、Memcached、MongoDb使用心得

    最近在思考数据库以及缓存的问题,发现这些知识点其实是有一点关联的,于是这篇文章通过一个连环提问的方式将这些知识点串联起来. 问:为什么要用 Memcached.Redis,直接用 MySQL 这些数据 ...

  6. Nginx 解决504 Error 最简单的方法

    <?php // Where am I ? set_time_limit(0); 就这个多,当然了,服务器还是务求稳妥,应当结合服务器和业务需求从配置上优化,才是正理.

  7. 100-Days-Of-ML-Code 评注版(Day 1)

    Day 1_Data PreProcessing(数据预处理) 本文引用自 Day 1_Data PreProcessing, 对其中内容进行了评注与补充说明. 导入数据 dataset = pd.r ...

  8. Debian Linux 下安装pip3

    由于Debian自带了python3,于是只需要安装pip 1.首先安装setuptools 下载wget --no-check-certificate https://pypi.python.org ...

  9. fdisk 命令总结

    fdisk 侧重点是如何将一块硬盘,进行分区,格式化然后使用 fdisk --help 或者man fdisk可以帮助我们快速上手 划分sdb这块硬盘 1.fdisk /dev/sdb 进行分区 2. ...

  10. 155. Minimum Depth of Binary Tree【LintCode by java】

    Description Given a binary tree, find its minimum depth. The minimum depth is the number of nodes al ...