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}
'''

这段代码中,foobar 接收到的是同一个对象,因为空字典在函数定义的时候就已经预先存在与内存中了。相似的,如果在类中定义一个可变数据类型,那么类的所有子类都可以操作这个数据!


迭代器(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 指南)的更多相关文章

  1. python冷知识(续)

    python 冷知识 1.交互式中修改最大递归深度 大家都知道使用递归是有风险的,递归深度过深容易导致堆栈的溢出. 那到底,默认递归次数限制是多少呢? 可以使用sys这个库来查看 >>&g ...

  2. 10个不为人知的 Python 冷知识

    转载: 1. 省略号也是对象 ...这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写…来得到这玩意. 而 ...

  3. python冷知识

    目录 省略号也是对象 奇怪的字符串 and 和 or 的取值顺序 访问类中的私有方法 时有时无的切片异常 两次 return for 死循环 intern机制 省略号也是对象 在python中一切皆对 ...

  4. 10 个不为人知的Python冷知识

    1. 省略号也是对象 ... 这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写-来得到这玩意. > ...

  5. python 冷知识

    nohup python robot.py nohup python -u robot.py > robot.log 2>&1 & -u 就是指定实时的日志输出目录,而 & ...

  6. 盘点 Python 中的那些冷知识(二)

    上一篇文章分享了 Python中的那些冷知识,地址在这里 盘点 Python 中的那些冷知识(一) 今天将接着分享!! 06. 默认参数最好不为可变对象 函数的参数分三种 可变参数 默认参数 关键字参 ...

  7. 分享一个撩妹、装13神技能,0基础用Python暴力破解WiFi密码

    WiFi密码Python暴力破解   Python密码破解部分截图 获取视频资料,转发此文+点击喜欢,然后获取资料请加Python交流群:580478401,就可以获取视频教程+源码 环境准备: py ...

  8. Python 浮点数的冷知识

    本周的PyCoder's Weekly 上分享了一篇小文章,它里面提到的冷知识很有意思,我稍作补充,分享给大家. 它提到的部分问题,读者们可以先思考下: 若两个元组相等,即 a==b 且 a is b ...

  9. Python基础知识思维导图|自学Python指南

    微信公众号[软件测试大本营]回复"python",获取50本python精华电子书. 测试/开发知识干货,互联网职场,程序员成长崛起,终身学习. 现在最火的编程语言是什么?答案就是 ...

随机推荐

  1. input属性设置type="number"之后, 仍可输入e, E, -, + 的解决办法

    <el-input v-model="scope.row.variables.leaderbuweiscores.score" @keyup.native="cha ...

  2. Spring的依赖注入和管理Bean

    采用Spring管理Bean和依赖注入 1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] Ap ...

  3. QT状态机

    首先吐槽下网上各种博主不清不楚的讲解 特别容易让新手迷惑 总体思想是这样的:首先要有一个状态机对象, 顾名思义,这玩意就是用来容纳状态的.然后调用状态机的start()函数它就会更具你的逻辑去执行相关 ...

  4. java 学习路线、java 入门、java自学、java 教程

    以前学习知识都是用到什么学什么,不是很系统.今天看到一个网站感觉挺不错的,分享给大家. 这个页面是学习路线功能的简介,如下图 ​ 点击选择学习路线 ​ 进入后可以选择循序渐进或者由终至始 ​ 上图标出 ...

  5. cs231n---CNN架构

    1 LeNet-5 (1998) 第一个被提出的卷积网络架构,深度较浅,用于手写数字识别. 2 AlexNet (2012) 架构为: CONV1 ->MAX POOL1 ->NORM1 ...

  6. java秒杀系列(2)- 页面静态化技术

    前言 通过代码片段分别介绍服务端渲染.客户端渲染.对象缓存三种方式的写法. 代码片段仅供参考,具体实现需要根据业务场景自行适配,但思想都是一样. 一.服务端渲染方式 1.接口返回html页面的设置 @ ...

  7. #348 大陆争霸(DIjkstra)

    在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林·布拉 ...

  8. C++ “::” 作用域符 双冒号

    C++ "::" 作用域符 双冒号 作用域符 :: 是作用域符,是运算符中等级最高的,它分为三种: 1)global scope(全局作用域符),用法(::name) 2)clas ...

  9. Spring参数的自解析--还在自己转换?你out了!

    背景前段时间开发一个接口,因为调用我接口的同事脾气特别好,我也就不客气,我就直接把源代码发给他当接口定义了. 没想到同事看到我的代码问:要么 get  a,b,c  要么  post [a,b,c]. ...

  10. [HAOI2015]树上染色(树上dp)

    [HAOI2015]树上染色 这种要算点对之间路径的长度和的题,难以统计每个点的贡献.这个时候一般考虑算每一条边贡献了哪些点对. 知道这个套路以后,那么这题就很好做了. 状态:设\(dp[u][i]\ ...