Python3 函数作用域
一 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 函数作用域的更多相关文章
- python3函数
一.python3函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.可以自己创建函数,这被叫做用户自定义函数. 1.定义函数规则 函 ...
- python015 Python3 函数
Python3 函数函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...
- Python函数作用域和匿名函数
匿名函数的定义 全局变量和局部变量的概念 global(全局变量)和 nonlocal(局部变量) 闭包.递归.回调 匿名函数 匿名函数 lambda 语法规则:lambda 参数 : 表达式 ...
- day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数
20180729 补充部分代码 20180727 上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...
- 07 . Python3函数
Python3函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().我们可以直接调用 ...
- 07.python函数作用域global、nonlocal、LEGB
函数作用域 作用域 一个标识符的课件范围,这就是标识符的作用域,一般常说的是变量的作用域 def foo(): x = 100 print(x) # 可以访问到吗 上例中x不可以访问到,会抛出异 ...
- 深入理解javascript函数定义与函数作用域
最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...
- js 碎片整理(变量声明,函数作用域)
1.变量声明: 在非严格模式下,函数可以对未声明的变量赋值,而这样赋值的结果就是该变量就会变成全局变量. (function(){ var a = 1; })(); console.log(a) ; ...
- Python函数作用域的查找顺序
函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...
随机推荐
- form组件-字段
Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML 1.Django内置字段如下: Field required=True, 是否 ...
- Navicat Premium 12 激活
链接:https://pan.baidu.com/s/1R4WB2JjKd0UYnN00CpUPSA 提取码:e3wy (破解工具及软件安装包) 破解流程:https://www.jianshu.co ...
- jdk 配置
JDK (绿色版) 此次安装的 JDK 版本为 1.8.0_77 步骤一: 拷贝 JDK(350M左右)到电脑 步骤二: 配置环境变量 JAVA_HOME , PATH , CLA ...
- jquery实现漂亮的轮播图
今天工作中要用到一个轮播功能,在网上找了一些,觉得有些过于繁琐,于是自己动手写了一个,效果如图: 代码如下: <!DOCTYPE html> <html lang="en& ...
- redis、Memcached、MongoDb使用心得
最近在思考数据库以及缓存的问题,发现这些知识点其实是有一点关联的,于是这篇文章通过一个连环提问的方式将这些知识点串联起来. 问:为什么要用 Memcached.Redis,直接用 MySQL 这些数据 ...
- Nginx 解决504 Error 最简单的方法
<?php // Where am I ? set_time_limit(0); 就这个多,当然了,服务器还是务求稳妥,应当结合服务器和业务需求从配置上优化,才是正理.
- 100-Days-Of-ML-Code 评注版(Day 1)
Day 1_Data PreProcessing(数据预处理) 本文引用自 Day 1_Data PreProcessing, 对其中内容进行了评注与补充说明. 导入数据 dataset = pd.r ...
- Debian Linux 下安装pip3
由于Debian自带了python3,于是只需要安装pip 1.首先安装setuptools 下载wget --no-check-certificate https://pypi.python.org ...
- fdisk 命令总结
fdisk 侧重点是如何将一块硬盘,进行分区,格式化然后使用 fdisk --help 或者man fdisk可以帮助我们快速上手 划分sdb这块硬盘 1.fdisk /dev/sdb 进行分区 2. ...
- 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 ...