博客
关于我
Python 中 3 个不可思议的返回功能
阅读量:797 次
发布时间:2023-03-06

本文共 2284 字,大约阅读时间需要 7 分钟。

Python 的三大神奇之处

1. 神奇的字典键

在 Python 中,字典的键是根据它们的哈希值进行匹配的。然而,值得注意的是,5 和 5.0 在 Python 中被视为同一个键。这是因为它们具有相同的哈希值。因此,当你执行以下代码时:

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

最终,some_dict[5] 的值会是 "Python",而不是 "JavaScript"。这是因为 Python 在处理这些键时,会将它们作为同一个键处理。

为什么会出现这样的情况?

这是因为 Python 会将浮点数和整数当作相同的键。具体来说,当你执行 some_dict[5] = "Python" 时,5 会被视为与 5.0 相同的键。因此,原有的 "JavaScript" 会被覆盖。

此外,需要注意的是,尽管 5 和 5.0 在 Python 中被视为相同的键,但它们的值是不同的。如果你想区分它们,应该使用不同的键类型。

哈希值的重要性

哈希值是一种用于快速查找数据的机制。Python 会根据对象的哈希值来决定如何存储和检索字典中的值。如果两个键具有相同的哈希值,它们会被视为相同的键。

需要注意的是,尽管哈希值相同,两个键的值可能不同(即哈希冲突)。然而,在 Python 中,5 和 5.0 会被视为相同的键,因为它们具有相同的哈希值。

2. 异常处理中的 return

在 Python 中,try-finally 结构中的 return 语句有一些特殊之处。具体来说,如果 try 块中有 return 语句,finally 块中的 return 语句仍然会执行。

例如:

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

当你调用 some_func() 时,输出会是 'from_finally'。这是因为 Python 会先执行 try 块中的 return 语句,然后再执行 finally 块中的 return 语句。

为什么会这样?

这是因为 Python 的异常处理机制是这样的。无论 try 块中是否有 return 语句,finally 块中的代码都会执行。因此,try 块中的 return 语句会被 finally 块中的 return 语句覆盖。

return 语句的执行顺序

函数的返回值是由最后执行的 return 语句决定的。在 try-finally 结构中,finally 块中的 return 语句是最后执行的语句。因此,函数的返回值是由 finally 块中的 return 语句决定的。

这也是为什么在 try-finally 结构中,try 块中的 return 语句会被 finally 块中的 return 语句覆盖的原因。

3. 相同对象的判断

在 Python 中,对象的比较是基于它们的身份(id)和哈希值的。一般来说,两个不同的对象不会相等。但是,有时候它们可能具有相同的哈希值。

例如:

class WTF:    passwtf1 = WTF()wtf2 = WTF()print(wtf1 == wtf2)  # 输出: Falseprint(wtf1 is wtf2)  # 输出: Falseprint(hash(wtf1) == hash(wtf2))  # 输出: Trueprint(id(wtf1) == id(wtf2))  # 输出: True

为什么 id 相同?

这是因为 id 函数会返回对象的内存地址。在 CPython 中,id 函数会返回对象的内存地址。因此,当两个对象的内存地址相同时,它们的 id 值也会相同。

为什么 is 运算符返回 False?

is 运算符用于比较两个对象是否是同一个对象。例如:

wtf1 = WTF()wtf2 = WTF()print(wtf1 is wtf2)  # 输出: False

这是因为 wtf1 和 wtf2 是两个不同的对象。虽然它们的 id 值相同,但它们是两个不同的对象。

为什么 hash 值相同?

哈希值是根据对象的 hash 方法返回的值。在 Python 中,两个不同的对象可能具有相同的哈希值(哈希冲突)。这可能会导致哈希表(如字典)中出现冲突。

对象的销毁顺序

在上面的代码中,你可以看到,当对象被销毁时,它们的 del 方法会被调用。例如:

class WTF(object):    def __init__(self):        print("I")    def __del__(self):        print("D")wtf1 = WTF()wtf2 = WTF()print(wtf1 is wtf2)  # 输出: Falseprint(id(wtf1) == id(wtf2))  # 输出: True

在上面的例子中,wtf1 和 wtf2 是两个不同的对象。它们的 id 值相同,但它们是两个不同的对象。这是因为 id 函数在生成这两个对象时,返回了相同的内存地址。

然而,当其中一个对象被销毁时,它的 id 会被重新分配给另一个对象。这就是为什么在销毁顺序不同的情况下,对象的 id 值可能会不同。

转载地址:http://xyofk.baihongyu.com/

你可能感兴趣的文章
Python 从入门到精通:30天速成教程到底有多狠?你能坚持下来吗?
查看>>
Python 从数据库中存储和检索密码的最安全方法
查看>>
Python语言及其应用 - 知识点遍历
查看>>
Python 优化提速的 8 个小技巧
查看>>
Python 余弦相似度与皮尔逊相关系数 计算
查看>>
python 使用execjs 报编码错误解决办法,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 145: il
查看>>
python 使用filetype校验文件
查看>>
Python 使用flush函数将缓冲区数据立即写磁盘
查看>>
python 使用in判断不准确,in不好使
查看>>
Python 使用pandas 进行查询和统计详解
查看>>
Redis 配置文件redis.conf详细解释
查看>>
python网络爬虫(2)——scrapy框架的基础使用
查看>>
python网络爬虫实例教程试读_Python网络爬虫实战教程(全套完整版) - 学途无忧网 - 做技术的王者 - Powered By EduSoho...
查看>>
Python 使用哈希函数用于加密
查看>>
Python 依赖管理的革新——Poetry 深度解析
查看>>
python 保留精度及增加去除数字的千位分隔符(金额化数字)
查看>>
python 倒计时 9,8,7,。。。。。。0
查看>>
Python 入门开发学习笔记之数据的增删改查
查看>>
Python 入门教程(2)搭建环境 2.4、VSCode配置Node.js运行环境
查看>>
Python 八大排序算法合集
查看>>