Python在集合构建期间自动简化浮点数到整数

时间:2015-03-16 01:50:48

标签: python

我在创建floatint数据类型集时遇到了一些问题,例如

my_set = {1.00 1}

我认为这是一组两个不同的元素,一个浮点1.00和一个整数1。但是,默认为:

>>> my_set = set([1])

此处,float消失,只剩下int。由于1.00 in my_set返回True.

,事情会变得混乱

我想知道是否有人能解释实际发生的事情?有办法解决这个问题吗?

6 个答案:

答案 0 :(得分:4)

>>> 1 == 1.0
True
>>> hash(1) == hash(1.0)
True

Python认为两者在集合中使用和作为映射键完全相同。解决这个问题的唯一方法是将两个值都包装在一个自定义类中,该类将上述任一比较评估为false。

答案 1 :(得分:1)

Hint

>>> a = 1
>>> b = 1.00
>>> a.__hash__()
1
>>> b.__hash__()
1

答案 2 :(得分:1)

  

我认为这是一组两个不同的元素,一个浮动1.00和一个整数。

这是你的问题。 Python认为它们是一个元素,第一。这个数字是表示为浮点数还是int数并不会改变它是相同数字的事实。

答案 3 :(得分:1)

  

我想知道是否有人能解释实际发生的事情?是   有办法解决这个问题吗?

给出的解释应该足够了。我能看到的最简单的方法是,如果您从用户那里获得此输入,则在将其存储到集合中之前不要将其转换为数字形式。 更复杂的方法是将条目存储为(值,类型)的元组:{(1, int), (1, float)},但这对我来说似乎完全是疯了。

我建议你在根据用户提供的表示形式区分两个相等的数字之前,先考虑很久。

答案 4 :(得分:1)

正如其他答案所解释的那样,因为(int)1和(float)1.0具有相同的散列测试为equals,所以就Set而言,它们是相同的。< / p>

有时语言/标准库会有一个IdentitySet类来收集确切的对象(通过&#39; identity&#39;)而不是相等。

另一个问题的答案 - https://stackoverflow.com/a/16994637/130288 - 显示了Python的一个小IdentitySet实现。它将插入的对象包装在另一个类Ref中,以强制进行身份比较 - 大致与Ignacio的回答一样。

答案 5 :(得分:0)

因为(int)1和(float)1.0具有相同的散列,所以你不能得到一个同时具有1和1.0的集合

您可以改为实现自己的设置。使用type()来区分int和float