通过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 相关文章推荐
通过数据库向Django模型添加字段的示例
Jul 21 Python
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
Python有序字典简单实现方法示例
Sep 28 Python
python随机取list中的元素方法
Apr 08 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
python opencv实现证件照换底功能
Aug 19 Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
Python requests.post方法中data与json参数区别详解
Apr 30 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 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存储过程调用实例代码
2013/02/03 PHP
深入PHP nl2br()格式化输出的详解
2013/06/05 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
Python性能提升之延迟初始化
2016/12/04 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
Python删除n行后的其他行方法
2019/01/28 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
使用tkinter实现三子棋游戏
2021/02/25 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
汉语专业应届生求职信
2013/10/01 职场文书
婚庆司仪开场白
2015/05/29 职场文书
小程序自定义轮播图圆点组件
2022/06/25 Javascript