通过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开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
谈谈如何手动释放Python的内存
Dec 17 Python
Django添加sitemap的方法示例
Aug 06 Python
python如何查看微信消息撤回
Nov 27 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
Python实现的多进程拷贝文件并显示百分比功能示例
Apr 09 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 Python
python主要用于哪些方向
Jul 05 Python
多个版本的python共存时使用pip的正确做法
Oct 26 Python
python二维图制作的实例代码
Dec 03 Python
python 实现端口扫描工具
Dec 18 Python
利用For循环遍历Python字典的三种方法实例
Mar 25 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
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
PHP attributes()函数讲解
2019/02/03 PHP
Display SQL Server Version Information
2007/06/21 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
jquery随机展示头像代码
2011/12/21 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
python模块restful使用方法实例
2013/12/10 Python
Python可跨平台实现获取按键的方法
2015/03/05 Python
利用Python实现图书超期提醒
2016/08/02 Python
python实现简单flappy bird
2018/12/24 Python
从0开始的Python学习016异常
2019/04/08 Python
Django分组聚合查询实例分享
2020/04/29 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
Python和Bash结合在一起的方法
2020/11/13 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
圣诞节红领巾广播稿
2014/02/03 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
学习党章的体会
2014/11/07 职场文书
nginx服务器的下载安装与使用详解
2021/08/02 Servers