通过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多进程编程
Jun 12 Python
Python爬虫DOTA排行榜爬取实例(分享)
Jun 13 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
浅析python的Lambda表达式
Feb 27 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
Apr 03 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
使用python实现哈希表、字典、集合操作
Dec 22 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
python各层级目录下import方法代码实例
Jan 20 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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需登录的文件上传管理系统
2020/03/21 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
jQuery大于号(&gt;)选择器的作用解释
2015/01/13 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
Python基于locals返回作用域字典
2020/10/17 Python
css3 按钮样式简单可扩展创建
2013/03/18 HTML / CSS
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
群众路线教育党员自我剖析材料
2014/10/06 职场文书
先进个人事迹材料
2014/12/29 职场文书
政府会议通知范文
2015/04/15 职场文书
党支部审查意见
2015/06/02 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang