通过5个知识点轻松搞定Python的作用域


Posted in Python onSeptember 09, 2016

1、块级作用域

想想此时运行下面的程序会有输出吗?执行会成功吗?

#块级作用域
 
if 1 == 1:
 name = "lzl"
 
print(name)
 
 
for i in range(10):
 age = i
 
print(age)

我们先看下执行结果

C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py
lzl
9
 
Process finished with exit code 0

代码执行成功,没有问题;在Java/C#中,执行上面的代码会提示name,age没有定义,而在Python中可以执行成功,这是因为在Python中是没有块级作用域的,代码块里的变量,外部可以调用,所以可运行成功;

 2、局部作用域

回顾之前学过的知识,我们学函数的时候,函数是个单独的作用域,Python中没有块级作用域,但是有局部作用域;看看下面的代码

#局部作用域
 
def func():
 name = "lzl"
 
print(name)

运行这段代码,想想会不会有输出?

Traceback (most recent call last):
 File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>
 print(name)
NameError: name 'name' is not defined

运行报错,我相信这个大家都能理解,name变量只在func()函数内部中生效,所以在全局中是没法调用的;对上面代码做个简单调整,再看看结果如何?

#局部作用域
 
def func():
 name = "lzl"
 
func()   #执行函数
print(name)

对之前的代码添加了一句代码,在变量name打印之前,执行了一下函数,此时打印会不会有变化?

Traceback (most recent call last):
 File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>
 print(name)
NameError: name 'name' is not defined

执行依然报错,还是回到刚才那句话:即使执行了一下函数,name的作用域也只是在函数内部,外部依然无法进行调用;把前两个知识点记住,接下来要开始放大招了

3、作用域链

对函数做下调整,看看下面的代码执行结果如何?

#作用域链
 
name = "lzl"
def f1():
 name = "Eric"
 def f2():
  name = "Snor"
  print(name)
 f2()
f1()

学过函数,肯定知道最后f1()执行完会输出Snor;我们先记住一个概念,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错

4、终极版作用域

好,铺垫了够了,终极版的来了~~

#终极版作用域
 
name = "lzl"
 
def f1():
 print(name)
 
def f2():
 name = "eric"
 f1()
 
f2()

想想最后f2()执行结果是打印“lzl”呢,还是打印“eric”?记住自己的答案,现在先不把答案贴出来,先看看下面这段代码:

#终极版作用域
 
name = "lzl"
 
def f1():
 print(name)
 
def f2():
 name = "eric"
 return f1
 
ret = f2()
ret()
 
#输出:lzl

执行结果为“lzl”,分析下上面的代码,f2()执行结果为函数f1的内存地址,即ret=f1;执行ret()等同于执行f1() ,执行f1()时与f2()没有任何关系,name=“lzl”f1()在一个作用域链,函数内部没有变量是会向外找,所以此时变量name值为“lzl”;理解了这个,那么刚才没给出答案的那个终极代码你也知道答案了

#终极版作用域
 
name = "lzl"
 
def f1():
 print(name)
 
def f2():
 name = "eric"
 f1()
 
f2()
 
# 输出:lzl

是的,输出的是“lzl”,记住在函数未执行之前,作用域已经形成了,作用域链也生成了

5、新浪面试题

li = [lambda :x for x in range(10)]

判断下li的类型?li里面的元素为什么类型?

print(type(li))
print(type(li[0]))
 
# <class 'list'>
# <class 'function'>

可以看到li为列表类型,list里面的元素为函数,那么打印list里面第一个元素的返回值,此时返回值为多少?

#lambada 面试题
 
li = [lambda :x for x in range(10)]
 
res = li[0]()
print(res)
 
#输出:9

li第一个函数的返回值为9还不是0,记住:函数在没有执行前,内部代码不执行;博客里面的代码可以自己练练,加深下印象

总结

以上就是这篇文章的全部内容了,不知道对大家的学习和工作能不能带来一些帮助,如果大家有疑问可以留言交流。

Python 相关文章推荐
python生成日历实例解析
Aug 21 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
python实现彩票系统
Jun 28 Python
Python图像滤波处理操作示例【基于ImageFilter类】
Jan 03 Python
解决Python列表字符不区分大小写的问题
Dec 19 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
如何Tkinter模块编写Python图形界面
Oct 14 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
Feb 03 Python
Python使用pandas导入csv文件内容的示例代码
Dec 24 Python
python验证码识别的实例详解
Sep 09 #Python
Python随机数random模块使用指南
Sep 09 #Python
利用ctypes提高Python的执行速度
Sep 09 #Python
python实现批量监控网站
Sep 09 #Python
利用python批量检查网站的可用性
Sep 09 #Python
Python如何判断数独是否合法
Sep 08 #Python
python框架django基础指南
Sep 08 #Python
You might like
神族 PROTOSS 概述
2020/03/14 星际争霸
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
简单的python后台管理程序
2017/04/13 Python
python版简单工厂模式
2017/10/16 Python
pandas object格式转float64格式的方法
2018/04/10 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
python selenium 弹出框处理的实现
2019/02/26 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
python实现超市商品销售管理系统
2019/10/25 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
Django多个app urls配置代码实例
2020/11/26 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
个人三严三实对照检查材料
2014/09/25 职场文书
自查自纠工作总结
2014/10/15 职场文书
2014年护理工作总结范文
2014/11/14 职场文书
实名检举信范文
2015/03/02 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
基于Nginx实现限制某IP短时间访问次数
2021/03/31 Servers