通过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 相关文章推荐
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
Python中使用Inotify监控文件实例
Feb 14 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
Python微信公众号开发平台
Jan 25 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
python 使用递归回溯完美解决八皇后的问题
Feb 26 Python
提高python代码运行效率的一些建议
Sep 29 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 Python
Python实现信息管理系统
Jun 05 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
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
详解Python中用于计算指数的exp()方法
2015/05/14 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
python如何删除文件、目录
2020/06/23 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
外包公司软件测试工程师
2014/11/01 面试题
关于逃课的检讨书
2014/01/23 职场文书
人事部专员岗位职责
2014/03/04 职场文书
一体化教学实施方案
2014/05/10 职场文书
4s店活动策划方案
2014/08/25 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
业务员辞职信范文
2015/03/02 职场文书
2015个人半年总结范文
2015/03/09 职场文书
送达通知书
2015/04/25 职场文书
Java设计模式之享元模式示例详解
2022/03/03 Java/Android
零基础学java之循环语句的使用
2022/04/10 Java/Android
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL