您能解决这3个(看似)简单的Python问题吗?
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789
提示:所有问题都有共同点,因此在解决其余问题之前检查第一个问题的解决方案可以减轻挑战。

问题1
假设我们有几个变量:
- x = 1
- y = 2
- l = [x, y]
- x += 5
- a = [1]
- b = [2]
- s = [a, b]
- a.append(5)
l和s的打印结果是什么?
跳到解决方案
问题2
让我们定义一个简单的函数:
- def f(x, s=set()):
- s.add(x) print(s)
如果您决定,将会发生什么:
- >>f(7)
- >>f(6, {4, 5})
- >>f(2)
- ?
跳到解决方案
问题3
让我们定义两个简单的函数:
- def f():
- l = [1]
- def inner(x):
- l.append(x)
- return l
- return inner
- def g():
- y = 1
- def inner(x):
- y += x
- return y
- return inner
以下命令将产生什么结果?
- >>ff_inner = f()
- >>print(f_inner(2))
- >>gg_inner = g()
- >>print(g_inner(2))
跳到解决方案
您对自己的回答有多自信? 让我们看看您是否正确。
解决问题1
- >>print(l)
- [1, 2]
- >>print(s)
- [[1, 5], [2]]
为什么第二个列表对第一个元素a.append(5)的更改有反应,但是第一个列表完全忽略x + = 5的类似变化?
解决问题2
让我们看看发生了什么:
- >>f(7){7}
- >>f(6, {4, 5}){4, 5, 6}
- >>f(2){2, 7}
等待,最后输出不是{2}吗?
解决问题3
输出将是以下内容:
- >>ff_inner = f()
- >>print(f_inner(2))[1, 2]
- >>gg_inner = g()
- >>print(g_inner(2))
- UnboundLocalError: local variable 'y' referenced before assignment
为什么g_inner(2)不输出3? f()的内部函数如何记住其外部范围,而g()的内部函数却不记得呢? 它们实际上是相同的!
说明
如果我告诉您这些怪异的行为与Python中可变对象和不可变对象之间的区别有关怎么办?
诸如列表,集合或字典之类的可变对象可以在适当位置进行更改(变异)。 不变的对象(如整数,字符串和元组)不能—此类对象的"更改"会导致创建新对象。
问题1的说明
- x = 1
- y = 2
- l = [x, y]
- x += 5
- a = [1]
- b = [2]
- s = [a, b]
- a.append(5)
- >>print(l)
- [1, 2]
- >>print(s)
- [[1, 5], [2]]
由于x是不可变的,因此操作x + = 5不会更改原始对象,而是创建一个新对象。 列表的第一个元素仍指向原始对象,因此其值保持不变。
对于可变对象a,a.append(5)更改原始对象,因此list s"看到"更改。
问题2的解释
- def f(x, s=set()):
- s.add(x)
- print(s)
- >>f(7)
- {7}
- >>f(6, {4, 5})
- {4, 5, 6}
- >>f(2)
- {2, 7}
前两个输出完全有意义:首先将值7添加到默认空集中,得到{7},然后将值6添加到一组{4,5}中,得到{4,5,6 }。
但是随后发生了一件奇怪的事情:将值2添加到默认的空集而不是添加到{7}的集。 为什么? 可选参数s的默认值仅被评估一次-仅在第一次调用s期间将被初始化为空集。 由于s在调用f(7)之后是可变的,因此就地进行了修改。 第二个调用f(6,{4,5})不会影响默认参数-提供的集合{4,5}将其遮蔽,换句话说,{4,5}是一个不同的变量。 第三次调用f(2)使用的是与第一次调用相同的s变量,但是s未作为空集重新初始化-使用了其先前的值{7}。
这就是为什么您不应该使用可变的默认参数的原因。 在这种情况下,应按以下方式修改功能:
- def f(x, s=None):
- if s is None:
- s = set()
- s.add(x)
- print(s)
问题3的解释
- def f():
- l = [1]
- def inner(x):
- l.append(x)
- return l
- return inner
- def g():
- y = 1
- def inner(x):
- y += x
- return y
- return inner
- >>ff_inner = f()
- >>print(f_inner(2))
- [1, 2]
- >>gg_inner = g()
- >>print(g_inner(2))
- UnboundLocalError: local variable ‘y’ referenced before assignment
在这个问题中,我们处理闭包-内部函数记住定义时它们的封闭名称空间的外观。 或至少应该如此-第二个功能保持扑克面孔,就像从未听说过其外部作用域一样。
这是为什么? 当我们执行l.append(x)时,在定义时创建的可变对象被修改,但是变量l仍然指向内存中的相同地址。 但是,尝试更改第二个函数y + = x中的不可变变量会导致y指向内存中与以前不同的地址-原始y将不再被记住,因此导致UnboundLocalError。
结论
Python中可变对象与不可变对象之间的区别非常重要。 请注意这一点,以避免出现本文所述的奇怪行为。 特别是:
- 不要使用可变的默认参数。
- 不要尝试在内部函数中更改不可变的闭包变量。
- 请随意分享其他示例,这些示例可能是由于您在响应中误用了可变的和不变的对象而导致的潜在问题。
您能解决这3个(看似)简单的Python问题吗?的更多相关文章
- 解决:layUI数据表格+简单查询
解决:layUI数据表格+简单查询 最近在用layui写项目,在做到用户查询时,发现在layui框架里只有数据表格,不能增加查询.于是自己摸索了一下,写个笔记记录一下. 我想要的效果: 1.定义查询栏 ...
- 带你简单了解python协程和异步
带你简单了解python的协程和异步 前言 对于学习异步的出发点,是写爬虫.从简单爬虫到学会了使用多线程爬虫之后,在翻看别人的博客文章时偶尔会看到异步这一说法.而对于异步的了解实在困扰了我好久好久,看 ...
- 【转】简单谈谈python的反射机制
[转]简单谈谈python的反射机制 对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面 ...
- Tkinter制作简单的python编辑器
想要制作简单的python脚本编辑器,其中文字输入代码部分使用Tkinter中的Text控件即可实现. 但是问题是,如何实现高亮呢?参考python自带的编辑器:python27/vidle文件夹中的 ...
- 简单的Python GUI界面框架
Python开发GUI界面, 可以使用pyQT或者wxpython. 不过不论pyQT还是wxpython都需要比较多的学习成本.Python工程往往是用于快速开发的,有些时候引入pyQT,wxpyt ...
- 完成一段简单的Python程序,使用函数实现用来判断输入数是偶数还是奇数
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,使用函数实现用来判断偶数和奇数'''def number_deal(a): if a%2==0 ...
- 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...
- 简单的python http接口自动化脚本
今天给大家分享一个简单的Python脚本,使用python进行http的接口测试,脚本很简单,逻辑是:读取excel写好的测试用例,然后根据excel中的用例内容进行调用,判断预期结果中的返回值是否和 ...
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
- 简单的python购物车
这几天,一直在学python,跟着视频老师做了一个比较简单的python购物车,感觉不错,分享一下 products = [['Iphone8',6888],['MacPro ...
随机推荐
- python面试题二:Python 基础题
1.位和字节的关系? Byte 字节 bit 位 1Byte = 8bit 2.b.B.KB.MB.GB 的关系? 1Byte = 8bit KB 1KB=1024B MB 1MB=1024KB GB ...
- 数据可视化之分析篇(四)PowerBI分析模型:产品关联度分析
https://zhuanlan.zhihu.com/p/64510355 逛超市的时候,面对货架上琳琅满目的商品,你会觉得这些商品的摆放,或者不同品类的货架分布是随机排列的吗,当然不是. 应该都听说 ...
- python网络编程01 /C/S架构|B/S架构、网络通信原理、五层协议、七层协议简述、端口映射技术
python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述.端口映射技术 目录 python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述. ...
- 当我谈 HTTP 时,我谈些什么?
当我们打开网站时也许不会去留意网站前面的HTTP是怎么来的.但是它毫无疑问在网络中有着举足轻重的地位.本文从起源到发展,详说HTTP从1到3的演变. 说在前面 本文不致力于讲完 HTTP 的全部内容, ...
- jupyter中%matplotlib inline报错
学习matplotlib时,使用的jupyter跑代码.报错如上图.大致就是后面的注释不能被识别.我寻思着注释不用识别吧,大概是因为%后跟的语句被全部当成命令行执行了,然后命令行不识别行内注释,导致报 ...
- tineMCE 踩坑:images_upload_handler
tineMCE 的官方示例提供了前端上传图片方法 images_upload_handler 的写法. 但官方写的有点问题,上传会报错. 不过修改也很简单: images_upload_handler ...
- 太慢不能忍!CPU又拿硬盘和网卡开刀了!
总线技术 我是CPU一号车间的阿Q,最近为了一件事儿搞得我挺烦的. 当初我们CPU工厂刚刚来到主板上建厂时,那时候主板上的单位还不多,跟我们打交道最多的就是内存那家伙了. 后来,键盘.鼠标.硬盘.网卡 ...
- Python虚拟环境(virtualenv)
python虚拟环境 虚拟环境:一个独立的可以运行的python执行环境,可以创建多个,且相互之间互不影响 使用virtualenv库 pip install virtualenv 用法 # 创建虚拟 ...
- python获取主机IP,主机名
获取主机内网,外网IP,主机名 代码如下: #!/usr/bin/env python #-*- coding:utf-8 -*- # author:Zeng Xianhe import socket ...
- Spring集成Quartz定时任务
1.导入jar包 2.配置applicationContext.xml文件 <!-- 任务调度1 --> <!-- bean id="simpleJob" cla ...