为什么同一类的对象有相同的id,但在Python中字符串类型转换为float时却没有



当字符串被类型化为float时,为什么它会得到不同的id,而不是类型化为int?

我以为两者都一样。

有人能解释一下当字符串被转换成float时实际发生了什么吗?

当相同的对象已经可用时(如Python文档中所述),它应该获得相同的id

a = 5
b = "5"
id(a) == id(int(b))
# which comes True
# But
x = 5.0
y = "5.0"
id(x) == id(float(y))
# comes False
# Why ?

我原以为它是真的,但它是假的。

我想你看到的是实习的效果。出于性能原因,Python实习生某些可能经常使用的对象,例如短字符串和小整数。这意味着这些对象只有一个实例,因此相等测试(==运算符)与身份测试(is运算符或比较id())相同。5显然是其中一个整数,但我刚刚用a=9999和b="9999"进行了测试,发现id比较为False。(顺便说一句,您的id相等测试可以用is运算符写成"a is int(b)"。)

我认为这类事情通常被认为是一个实现细节;Python能够逃脱这一惩罚,因为字符串和int是不可变的,但当你问"x等于y吗?"时,使用相等(==)运算符通常是个好主意。==的结果并不取决于实现是否决定对有问题的对象进行实习生。

显然,开发人员认为对浮点执行同样的操作不值得麻烦,尽管我想他们可能会这样做,因为浮点也是不可变的。

最新更新