将元组与python

时间:2017-11-29 14:18:50

标签: python-3.x singleton comparison nan

我有一些具有相同维度的元组,其中一些包含NoneNaN元素。 我虽然里面有NaN的那些人不会比较等于,但事实上有些人比较等于。

我已阅读Python文档中的Value Comparisons,特别是部分说:

  

序列使用对应的比较按字典顺序进行比较   元素,强制执行元素的反身性。

     

在强制元素的反身性时,对集合进行比较   假设对于集合元素x,x == x始终为true。基于   在这个假设上,首先比较元素身份和元素   比较仅针对不同的元素进行。这种方法   产生与严格元素比较相同的结果,如果是   比较元素是反身的。对于非反身元素,   结果与严格元素比较不同,可能是   令人惊讶的是:非反身的非数字值例如结果   在列表中使用时的以下比较行为:

>>> nan = float('NaN')
>>> nan is nan     # True
>>> nan == nan     # False     <-- the defined non-reflexive behavior of NaN
>>> [nan] == [nan] # True  <-- list enforces reflexivity and tests identity first

这是让我提出问题的MCVE:

import numpy as np

# [1]
x = (12, float('nan'), 'test')
x == (12, float('nan'), 'test') # False

# [2]
y = (12, np.nan, 'test')
y == (12, np.nan, 'test') # True

# [3]
u = float('nan')
q = (12, u, 'test')
q == (12, u, 'test') # True

# [4]
v = (12, None, 'test')
v == (12, None, 'test') # True

所以,如果我已经正确理解 - 让我们谈谈相同长度的容器 - 容器比较的工作原理如下:

  • 它比较了元素;
  • 首先检查x_i is y_i;
  • 如果不是,则会检查x_i == y_i;
  • 如果身份 相等至少有一个元素失败,则会返回False,否则为True

这有点令人惊讶!

我也发现numpy.nan是单身人士:

np.nan is np.nan  # True

它不像是:

class test:
    @property
    def nan(self):
        return float('nan')
inst = test()
inst.nan is inst.nan # False

我的问题是:

  • 我的理由是正确的,还是我错过了其他的东西?
  • 还有另一种在Python中进行比较的方法,只能确保相等吗?

0 个答案:

没有答案