python 冷知识(装13 指南)
python 冷知识(装13 指南)
list1 += list2 和 list1 = list1 + list2 的区别
alpha = [1, 2, 3]
beta = alpha # alpha 的别名
beta += [4, 5] # alpha 和 beta 都是[1, 2, 3, 4, 5]
beta = beta + [6, 7] # 此时beta的内存地址已经变成了,[1, 2, 3, 4, 5, 6, 7]
print(alpha) # alpha 还是 [1, 2, 3, 4, 5]
会发生这样的情况就是可变数据类型在 += 的时候自身的内存地址不变,只是改变了这个地址里的值。而 beta + [6, 7] 返回了他们相加后的内存地址,此时已经和beta没有关系了。
在函数或类的定义中使用_None_代替可变数据类型
话不多说,直接上代码!
def func(msg, dic={}): # 把{} 改成None ,因為{}在函數定義的時候就會生成,每次調用都是它
'''模擬實際開發中,嘗試從文件中拿到字典,如果沒有就返回一個空字典'''
import json
try:
return json.load(msg)
except:
return dic
foo = func('bad data')
foo['name'] = 'hahaha'
bar = func('also bad data')
bar['age'] = 18
print(foo)
print(bar)
'''
{'name': 'hahaha', 'age': 18}
{'name': 'hahaha', 'age': 18}
'''
这段代码中,foo 和 bar 接收到的是同一个对象,因为空字典在函数定义的时候就已经预先存在与内存中了。相似的,如果在类中定义一个可变数据类型,那么类的所有子类都可以操作这个数据!
迭代器(iteration)冷门知识点
- 内置函数
iter()里如果传入的是一个迭代器,那么就会返回自身;如果传入的是一个可迭代对象,那么每次调用都会返回一个新的迭代器。 - 讲上面的知识点主要是因为:如果一个迭代器被迭代完了,它仍然可以放入
for循环,但是他已经是一个空的迭代器了。我们应该极力避免在程序中重复调用同一个迭代器!可以通过iter(obj) is iter(obj)来判断这个对象是不是迭代器,因为iteration不是类呀,无法使用isinstance()。 - 扩展: 上面提到
iter()里的对象是迭代器会返回其自己,那么很多同学就会想list()或者set()里传入其相同类型的数据会不会也返回其自身呢?那很遗憾,返回的是传入对象的浅拷贝。 - 继续上面的扩展:
str()和tuple()里传入相同数据类型返回的是其自身!(大家找到原因了吗?) - ****重点****:迭代器不存储列表元素!它只保留原始列表的当前索引,该索引指向下一个元素。所以如果在迭代完成前修改列表,那么迭代内容也会改变。补充:迭代字典不就相当于迭代字典的
key去得到value。
切片也是浅拷贝
在我项目过程中,遇到这样的一个问题,我要往一个列表里存入另一个列表作为其的一个元素,但是忘记了拷贝的问题。
a = []
b = [1,3]
a.append(b)
b += [6]
a # [1, 3, 6] 但是这不是我要的数据
# 将 a.append(b) 改为a.append(b[:]) 可以解决问题,更深的就需要用的深拷贝了
冷知识
bool类的父类是int类!dict类有.__dict__属性,但是它的实例没有!还敢公然报错说dict没有__dict__这个属性!但是如果继承了dict类的类的实例却有__dict__属性!
python 冷知识(装13 指南)的更多相关文章
- python冷知识(续)
python 冷知识 1.交互式中修改最大递归深度 大家都知道使用递归是有风险的,递归深度过深容易导致堆栈的溢出. 那到底,默认递归次数限制是多少呢? 可以使用sys这个库来查看 >>&g ...
- 10个不为人知的 Python 冷知识
转载: 1. 省略号也是对象 ...这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写…来得到这玩意. 而 ...
- python冷知识
目录 省略号也是对象 奇怪的字符串 and 和 or 的取值顺序 访问类中的私有方法 时有时无的切片异常 两次 return for 死循环 intern机制 省略号也是对象 在python中一切皆对 ...
- 10 个不为人知的Python冷知识
1. 省略号也是对象 ... 这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写-来得到这玩意. > ...
- python 冷知识
nohup python robot.py nohup python -u robot.py > robot.log 2>&1 & -u 就是指定实时的日志输出目录,而 & ...
- 盘点 Python 中的那些冷知识(二)
上一篇文章分享了 Python中的那些冷知识,地址在这里 盘点 Python 中的那些冷知识(一) 今天将接着分享!! 06. 默认参数最好不为可变对象 函数的参数分三种 可变参数 默认参数 关键字参 ...
- 分享一个撩妹、装13神技能,0基础用Python暴力破解WiFi密码
WiFi密码Python暴力破解 Python密码破解部分截图 获取视频资料,转发此文+点击喜欢,然后获取资料请加Python交流群:580478401,就可以获取视频教程+源码 环境准备: py ...
- Python 浮点数的冷知识
本周的PyCoder's Weekly 上分享了一篇小文章,它里面提到的冷知识很有意思,我稍作补充,分享给大家. 它提到的部分问题,读者们可以先思考下: 若两个元组相等,即 a==b 且 a is b ...
- Python基础知识思维导图|自学Python指南
微信公众号[软件测试大本营]回复"python",获取50本python精华电子书. 测试/开发知识干货,互联网职场,程序员成长崛起,终身学习. 现在最火的编程语言是什么?答案就是 ...
随机推荐
- 用maven工具管理web项目的错误记录:org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException
运行异常报告日志: 严重: Context initialization failedorg.springframework.beans.factory.xml.XmlBeanDefinitionSt ...
- shiro创建配置对象
在执行 Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory(&quo ...
- backtracing
5月10日 1 37 Sudoku Slover public void solveSudoku(char[][] board) { if(board == null || board.length ...
- TCP传输协议如何进行拥塞控制?
拥塞控制 拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象.这种现象跟公路网中 ...
- Spring 源码注解
一.@Retention可以用来修饰注解,是注解的注解,称为元注解. Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolic ...
- DesignPattern系列__05开闭原则
介绍 开闭原则是编程设计中最基本.最重要的原则. 定义:一个软件实体如类.方法和模块等,应该对扩展(提供方)开放,对修改(使用方)关闭.用抽象构建框架,用实现扩展细节. 也就是说,在需求发生新的变化时 ...
- ibatis 核心原理解析
最近查找一个生产问题的原因,需要深入研究 ibatis 框架的源码.虽然最后证明问题的原因与 ibatis 无关,但是这个过程加深了对 ibatis 框架原理的理解. 这篇文章主要就来讲讲 ibati ...
- Opengl_入门学习分享和记录_02_渲染管线(一)顶点输入
现在前面的废话:最近好事不断!十分开心!生活真美好! 好了今天要梳理一下,顶点输入的具体过程,同样也是渲染管线中的第一个阶段的详细过程的介绍.之前介绍过,OpenGL操作的是一组3D坐标,所以我们的输 ...
- javaweb基础整理随笔-----上传与下载步骤详解
这次整理的是上传与下载的原生代码解析: 上传:1.对页面的要求:enctype="multipart/form-data" method="post" ...
- 洛谷 P1960 列队
题意简述 有一个n × m 的矩阵,第i行第j列元素编号为(i - 1)× m +j 每次将一个数取出,其他元素依次向左,向上填补空缺,最后将取出的数放入矩阵最后一格 求每次取出数的编号 题解思路 由 ...