• Python 中 3 个不可思议的返回


    第一个: 神奇的字典键

    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将  5  和  5.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 ,  break  或  continue  后,  finally  子句依然会执行.

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

    广州vi设计http://www.maiqicn.com 我的007办公资源网站https://www.wode007.com

    第三个: 相同对象的判断

    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

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

  • 相关阅读:
    gateway dblink transport mssql image datatype to oracle blob datatype
    Sql server 数据库备份、恢复等
    sql full left right inner cross 基础
    真的发现自己已不再年轻
    利用日志备份恢复时,提示 该 LSN 太晚,无法应用到数据库
    系统调用原理(转)
    Linux添加自定义系统调用
    libusb 介绍
    用户空间与内核空间数据交换的方式(4)relayfs
    用户空间与内核空间数据交换的方式(2)procfs
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/13766973.html
Copyright © 2020-2023  润新知