通过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实现上下班抢个顺风单脚本
Feb 07 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
python编程使用协程并发的优缺点
Sep 20 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
解决Python对齐文本字符串问题
Aug 28 Python
python 利用pyttsx3文字转语音过程详解
Sep 25 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
快速创建python 虚拟环境
Nov 28 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 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
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
php简单图像创建入门实例
2015/06/10 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
Seajs源码详解分析
2019/04/02 Javascript
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
python3 enum模块的应用实例详解
2019/08/12 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
Python如何访问字符串中的值
2020/02/09 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
创建索引时需要注意的事项
2013/05/13 面试题
体育课课后反思
2014/04/24 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
中标通知书范本
2015/04/17 职场文书
出生证明范本
2015/06/15 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android
i7 6700处理器相当于i5几代
2022/04/19 数码科技