第一个:神奇的字典键

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.0True>>> hash(5) == hash(5.0)True

当执行 some_dict[5] = "Python" 语句时, 因为Python将 5 和 5.0 辨认为 some_dict 的同一个键, 所以已有值 “JavaScript” 就被 “Python” 笼罩了

第二个:异样解决中的return

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

Output:

>>> some_func()'from_finally'

???? 阐明:
当在 “try…finally” 语句的 try 中执行 return, break 或 continue 后, 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()IIDDFalse>>> id(WTF()) == id(WTF())IDIDTrue

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

以上就是本次分享的全部内容,当初想要学习编程的小伙伴欢送关注Python技术大本营,获取更多技能与教程。