加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

Python的51个“秘密”被曝光,GitHub获2万星

发布时间:2019-06-22 02:44:30 所属栏目:评测 来源:七月在线
导读:副标题#e# Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。 但有的时候,Python一些特性导致的输出结果,对于初学者就很难理解了。 一个解析51项堪称是秘密的Python特性项目,在GitHub上彻底火了。 英文原版已经拿到

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

  1. >>> 5 == 5.0 
  2. True 
  3. >>> hash(5) == hash(5.0) 
  4. True 

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

当执行 some_dict[5] = "Python" 语句时, 因为Python将 5 和 5.0 识别为 some_dict 的同一个键, 所以已有值 "JavaScript" 就被 "Python" 覆盖了。

到处返回!

  1. def some_func(): 
  2. try: 
  3. return 'from_try' 
  4. finally: 
  5. return 'from_finally' 
  6.  
  7. Output: 
  8.  
  9. >>> some_func() 
  10.  
  11. 'from_finally' 

说明:

当在 "try...finally" 语句的 try 中执行 return, break 或 continue 后, finally 子句依然会执行。

函数的返回值由最后执行的 return 语句决定。

由于 finally 子句一定会执行, 所以 finally 子句中的 return 将始终是最后执行的语句。

本质上,我们都一样

  1. class WTF: 
  2. pass 
  3.  
  4. Output: 
  5.  
  6. >>> WTF() == WTF() # 两个不同的对象应该不相等 
  7.  
  8. False 
  9.  
  10. >>> WTF() is WTF() # 也不相同 
  11.  
  12. False 
  13.  
  14. >>> hash(WTF()) == hash(WTF()) # 哈希值也应该不同 
  15.  
  16. True 
  17.  
  18. >>> id(WTF()) == id(WTF()) 
  19.  
  20. True 

说明:

当调用 id 函数时, Python 创建了一个 WTF 类的对象并传给 id 函数。

然后 id 函数获取其id值 (也就是内存地址), 然后丢弃该对象. 该对象就被销毁了。

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

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

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

  1. class WTF(object): 
  2. def __init__(self): print("I") 
  3. def __del__(self): print("D") 
  4.  
  5. Output: 
  6.  
  7. >>> WTF() is WTF() 
  8. False 
  9. >>> id(WTF()) == id(WTF()) 
  10. True 

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

为什么?

  1. some_string = "wtf" 
  2. some_dict = {} 
  3. for i, some_dict[i] in enumerate(some_string): 
  4. pass 
  5.  
  6. Output: 
  7.  
  8. >>> some_dict # 创建了索引字典. 
  9. {0: 'w', 1: 't', 2: 'f'} 

说明:

Python 语法 中对 for 的定义是:

  1. for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] 

其中 exprlist 指分配目标. 这意味着对可迭代对象中的每一项都会执行类似 {exprlist} = {next_value} 的操作。

一个有趣的例子说明了这一点:

  1. for i in range(4): 
  2. print(i) 
  3. i = 10 
  4.  
  5. Output: 
  6.  

你可曾觉得这个循环只会运行一次?

说明:

由于循环在Python中工作方式, 赋值语句 i = 10 并不会影响迭代循环, 在每次迭代开始之前, 迭代器(这里指 range(4)) 生成的下一个元素就被解包并赋值给目标列表的变量(这里指 i)了。

在每次迭代中, enumerate(some_string) 函数就生成一个新值 i (计数器增加) 并从 some_string 中获取一个字符。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读