通过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处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
python+matplotlib演示电偶极子实例代码
Jan 12 Python
利用Python如何生成便签图片详解
Jul 09 Python
Django 路由控制的实现代码
Nov 08 Python
使用Python在Windows下获取USB PID&amp;VID的方法
Jul 02 Python
Python使用线程来接收串口数据的示例
Jul 02 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
Python 实现二叉查找树的示例代码
Dec 21 Python
Python初识逻辑与if语句及用法大全
Aug 07 Python
详解Python flask的前后端交互
Mar 31 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
php7下的filesize函数
2019/09/30 PHP
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
jQuery的remove()方法使用详解
2015/08/11 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
TypeScript入门-基本数据类型
2017/03/28 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
微信小程序前端promise封装代码实例
2019/08/24 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
2014/08/15 Python
浅谈python 线程池threadpool之实现
2017/11/17 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
原装进口全世界:天猫国际
2016/08/03 全球购物
会计实习自我鉴定
2013/12/04 职场文书
运动会通讯稿100字
2014/01/31 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android