Python奇技淫巧:不可思议的返回

神奇的字典键

some_dict = {}
some_dict[5.5] = "python"
some_dict[5.0] = "C++"
some_dict[5] = "Golang"

输出如下:

>>> some_dict[5.5]
"python"
>>> some_dict[5.0]
"Golang"
>>> some_dict[5]
"Golang"

for k,v in some_dict.items():
		print(k,v)

输出如下:
5.5 python
5.0 Golang

"Golang" 消除了 "C++" 的存在?

 说明:

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

  • 具有相同值的不可变对象(比如字符串,数字类型)在Python中始终具有相同的哈希值.

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

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

异常处理中的return

def some_func():
	try:
		print("try子句")
		return 'from_try'
	finally:
		print("finall子句")
		return 'from_finally'

输出如下:

>>> some_func()
try子句
finall子句
from_finally

说明:

  • 当在 "try…finally" 语句的 try 中执行 returnbreak 或 continue 后,finally 子句依然会执行。

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

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

相同对象的判断

class WTF:
  pass

输出如下: 

>>> 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")

输出如下:

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

正如你所看到的,这是由于对象销毁的顺序所造成的不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫96

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值