转自/Python编程时光

三个比较冷门的知识。

第一个:神奇的字典键

some_dict = {}
some_dict[5.5] = "Ruby"
some_dict[5.0] = "JavaScript"
some_dict[5] = "Python"

Output:

>>> some_dict[5.5]
"Ruby"
>>> some_dict[5.0]
"Python"
>>> some_dict[5]
"Python"

"Python" 消除了 "JavaScript" 的存在?

???? 说明:

  • Python 字典通过检查键值是否相等和比较哈希值来确定两个键是否相同.

  • 具有相同值的不可变对象在Python中始终具有相同的哈希值.

注意: 具有不同值的对象也可能具有相同的哈希值(哈希冲突).

>>> 5 == 5.0
True
>>> hash(5) == hash(5.0)
True
  • 当执行 some_dict[5] = "Python" 语句时, 因为Python将 55.0 识别为 some_dict 的同一个键, 所以已有值 "JavaScript" 就被 "Python" 覆盖了.

  • 这个 StackOverflow的 回答(https://stackoverflow.com/a/32211042/4354153) 漂亮的解释了这背后的基本原理.

第二个:异常处理中的return

def some_func():try:return 'from_try'finally:return 'from_finally'

Output:

>>> some_func()
'from_finally'

???? 说明:

  • 当在 "try…finally" 语句的 try 中执行 return, breakcontinue 后, finally 子句依然会执行.

  • 函数的返回值由最后执行的 return 语句决定. 由于 finally 子句一定会执行, 所以 finally 子句中的 return 将始终是最后执行的语句.

第三个:相同对象的判断

class WTF:pass

Output:

>>> WTF() == WTF() # 两个不同的对象应该不相等
False
>>> WTF() is WTF() # 也不相同
False
>>> hash(WTF()) == hash(WTF()) # 哈希值也应该不同
True
>>> id(WTF()) == id(WTF())
True

???? 说明:

  • 当调用 id 函数时, Python 创建了一个 WTF 类的对象并传给 id 函数. 然后 id 函数获取其id值 (也就是内存地址), 然后丢弃该对象. 该对象就被销毁了.

  • 当我们连续两次进行这个操作时, Python会将相同的内存地址分配给第二个对象. 因为 (在CPython中) id 函数使用对象的内存地址作为对象的id值, 所以两个对象的id值是相同的.

  • 综上, 对象的id值仅仅在对象的生命周期内唯一. 在对象被销毁之后, 或被创建之前, 其他对象可以具有相同的id值.

  • 那为什么 is 操作的结果为 False 呢? 让我们看看这段代码.

class WTF(object):def __init__(self): print("I")def __del__(self): print("D")

Output:

>>> WTF() is WTF()
I
I
D
D
False
>>> id(WTF()) == id(WTF())
I
D
I
D
True

正如你所看到的, 对象销毁的顺序是造成所有不同之处的原因.

原文链接:https://github.com/leisurelicht/wtfpython-cn

以上就是今天的分享,如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

——END——
最近发现一个点外卖每顿饭都能少花5-20元的宝藏号。
就是她,↓点击下面名片关注公众号↓
进入公众号点击菜单领取红包最低5元,最高56元!

分享3 个Python冷知识相关推荐

  1. 链式比较、奇怪的字母、有趣的import...Python冷知识(六)

    本文转载自Python编程时光(ID:Python-Time) 冷知识系列,已经更新至第六篇. 谈谈 Python 那些不为人知的冷知识(一) 谈谈 Python 那些不为人知的冷知识(二) 谈谈 P ...

  2. 空字符串计数、让字典可排序...Python冷知识(五)

    本文转载自Python编程时光(ID: Python-Time) 冷知识系列,直至今日,已经更新至第五篇.前四篇给你准备好了,还没阅读的可以学习一下. 谈谈 Python 那些不为人知的冷知识(一) ...

  3. 反转字符串/列表、改变递归次数限制、else用法...Python 冷知识(四)

    本文转载自Python编程时光(ID:Python-Time) 冷知识系列,已经更新至第四篇.前三篇传送门在此,还没阅读的可以学习一下. 谈谈 Python 那些不为人知的冷知识(一) 谈谈 Pyth ...

  4. for死循环、怪异字符串、两次return……Python冷知识(三)

    本文转载自Python编程时光(ID:Python-Time) 冷知识系列,已经更新至第三篇.前两篇传送门小明给你准备好了,还没阅读的可以学习一下. 谈谈 Python 那些不为人知的冷知识(一) 谈 ...

  5. python冷知识_python冷知识

    省略号也是对象 在python中一切皆对象,省略号(...)也是一个对象注意:只能是三个点的省略号 在python中叫做Ellipsis 在python3中能直接得到它 print(...) prin ...

  6. 你所不知道的 Python 冷知识!(建议收藏)

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

  7. python的运算符号使等式成立_你所不知道的 Python 冷知识!(二)(建议收藏)

    首发于微信公众号:Python编程时光 ' 每周三更新五个冷知识,欢迎前往订阅! 01. 交互式"_"操作符 对于 _ ,我想很多人都非常熟悉. 给变量取名好艰难,用 _: 懒得长 ...

  8. Python冷知识之神秘漫画!

    欢迎加入QQ学习交流群,与我们一起学习,一起进步吧! 群号:225361733 可以QQ扫一扫加入群聊哦! 我是小豆,我--又来写没技术的文章了! 那么------ 当然是吃屎--哦不是,是讲冷知识! ...

  9. 那些让你惊掉下巴到肚皮上的python冷知识(一)

    一.我不是我 现在,我们在交互模式下分别定义两个变量:a,b,他们的值都等于200: 然后判断a和b是否是引用的同一对象,并打印出来: 很显然a和b引用的是同一对象,所以返回的结果为true 是不是觉 ...

最新文章

  1. MSSQL 访问Mysql
  2. Windows下Unity5x的安装
  3. opc服务器组态文件已写保护_iscada电力组态监控源代码,电力组态版,只有opc驱动版本...
  4. mac securecrt程序无响应_如何重置mac上的系统管理控制器smc教程
  5. 如何使用无线连接来使Android调试手机
  6. nagios插件脚本check_linux_stats.pl 安装
  7. 3G中的A-GPS移动定位技术
  8. 「CF1154F」Shovels Shop【背包DP】
  9. 网页版番茄时钟的制作——Pomodoro Clock
  10. 使用一个git仓库管理多个项目
  11. 现在的SQLSERVER数据库监控软件有哪些?
  12. “Xilinx ZYNQ+TCP通信+Python上位机”实现实时视频传输系统
  13. Titan框架入门指南:Titan如何工作
  14. C++友元函数实现两个复数相加
  15. HTTP 错误 404.2 - Not Found(由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。)
  16. 【CodingNoBorder - 06】无际软工队 - 会议纪要博客列表
  17. 搭建局域网,通过DHCP实现电脑自动获取IP地址
  18. 互联网时代内容分发四宗罪
  19. Acrel-EIoT 能源物联网开放平台
  20. [转]BEHAVOUR TREE2

热门文章

  1. Centos7 单台服务器搭建Elasticsearch6.0.1集群
  2. 百度代码规范 -- PHP
  3. CSS使用display:incline与float:left的区别:脱离文档流 参差不齐
  4. PHP的Excel操作
  5. PHP的max_execution_time
  6. thinkphp5 获取当前的域名
  7. linux双核对线程,Linux检查双核(及多核)CPU信息
  8. html任务3 模拟滚动条,vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件...
  9. Tomcat9 无法启动组件[Connector[AJP/1.3-8009]]
  10. 【uniapp】组件封装与引用