通过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的pyxmpp2中的主循环使其提高性能
Apr 24 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
使用Python对Access读写操作
Mar 30 Python
利用Python如何实现数据驱动的接口自动化测试
May 11 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
Pycharm更换python解释器的方法
Oct 29 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
python中设置超时跳过,超时退出的方式
Dec 13 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 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实现登陆验证码(类似条行码状)
2006/10/09 PHP
一步一步学习PHP(8) php 数组
2010/03/05 PHP
精美漂亮的php分页类代码
2013/04/02 PHP
PHP获取MAC地址的具体实例
2013/12/13 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
ASP SQL防注入的方法
2008/12/25 Javascript
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
js 只比较时间大小的实例
2017/10/26 Javascript
微信小程序使用Promise简化回调
2018/02/06 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
python+PyQT实现系统桌面时钟
2020/06/16 Python
python+tkinter实现学生管理系统
2019/08/20 Python
django 外键创建注意事项说明
2020/05/20 Python
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
汽车机修工岗位职责
2014/03/06 职场文书
工作说明书格式
2014/07/29 职场文书
共青团员自我评价
2015/03/10 职场文书
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python