通过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多线程(python多线程简明教程)
Jun 09 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
Python设计模式之抽象工厂模式
Aug 25 Python
Python实现简单的多任务mysql转xml的方法
Feb 08 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
Python 对象中的数据类型
May 13 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
python实现爬山算法的思路详解
Apr 09 Python
python字典一键多值实例代码分享
Jun 14 Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 Python
Python 列表的清空方式
Jan 13 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获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
php 常用类整理
2009/12/23 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
php数组的一些常见操作汇总
2011/07/17 PHP
php curl基本操作详解
2013/07/23 PHP
php实现的SESSION类
2014/12/02 PHP
php实现Session存储到Redis
2015/11/11 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
jquery tab插件制作实现代码
2010/06/22 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
python版大富翁源代码分享
2018/11/19 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
2014年重阳节活动策划方案书
2014/09/16 职场文书
招商引资工作汇报
2014/10/28 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python
分享7个 Python 实战项目练习
2022/03/03 Python
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers