同事考我这个问题,我答不上来,特来求助
>>> a is a
True
>>> a == a
False
同事给出的答案是:numpy.nan
和float("NaN")
,试了一下确实是这样,2和3都支持
math.nan
是python3的特性,python2不支持
感谢 @roy2220 @cxyfreedom @flowfire @whoami9894 提供正确答案!
@stamaimer @ebingtel @zhongyiio @SingeeKing @goinghugh 几位用魔法方法开挂不算哈。。。
不过作为小白还是学到了新东西,python原来还可以这么玩![捂脸]
感谢几位提供思路!
1
lifeishort 2018-05-29 19:06:37 +08:00 via iPhone
a=None 的时候是这样的
|
2
stamaimer 2018-05-29 19:08:01 +08:00 via iPhone
定义__equals__方法
|
3
ebingtel 2018-05-29 19:10:30 +08:00
@lifeishort @hjq98765
Python 2.7 >>> a = None >>> None is None True >>> None == None True >>> True == True True >>> class A(object): ... def __eq__(self, a): ... return self is not a ... >>> b = A() >>> b is b True >>> b ==b False |
4
roy2220 2018-05-29 19:11:24 +08:00 via Android
math.nan
|
5
zhongyiio 2018-05-29 19:13:38 +08:00
|
6
lifeishort 2018-05-29 19:18:30 +08:00 via iPhone
@ebingtel
我记错了,感谢指正 |
7
cxyfreedom 2018-05-29 19:35:59 +08:00 via iPhone
自带的话 math.nan ,或者第三方库 numpy.NaN
|
8
flowfire 2018-05-29 19:39:10 +08:00 via iPhone
NaN 试一下?
|
9
jtsai 2018-05-29 19:43:19 +08:00 via Android
内存空间的问题 你 id () 一下
|
10
SingeeKing 2018-05-29 19:48:58 +08:00 1
正常情况下是没有的。
原因:is 是判断是不是一个( id 值相同),== 是判断是否相等(__eq__ 返回 True ) 按照常理,id 相同必相等 但是确实可以。。。 |
11
whoami9894 2018-05-29 20:02:44 +08:00 via Android
```python
a = float("NaN") print(a==a) print(a is a) ``` |
12
pkookp8 2018-05-29 20:12:24 +08:00 via Android
@SingeeKing 这思路可以。。。
|
13
codeeer 2018-05-29 20:18:55 +08:00 via iPhone
引用类型
|
14
sammo 2018-05-29 20:20:49 +08:00 via Android
C++ 就没这么多破事
|
15
codehz 2018-05-29 23:37:10 +08:00
@sammo #14 C++ 浮点数 NaN 也是自身不相等的,只要是按照 IEEE 标准设计的浮点数,都要满足 NaN != NaN
|
16
phithon 2018-05-29 23:52:31 +08:00
|
17
phithon 2018-05-29 23:53:12 +08:00
想了个反的,哈
|
18
goinghugh 2018-05-30 10:02:28 +08:00
`is`判断是否是同一个对象,即 2 个的引用是否指向同一个对象;
`==`返回的是`__eq__`的返回值。 ![]( ) 在题主的问题里,只要是指向同一个对象,a is a 都是为 True,a==a 可以通过重写`__eq__`方法达成目的 |
19
GeruzoniAnsasu 2018-05-30 11:40:13 +08:00
|
20
lifeishort 2018-05-31 08:01:22 +08:00 via iPhone
把 js 的 NAN 和 python 搞混了,尴尬的一楼。
|
21
gaMe5hGLc86G4U52 2018-06-01 09:16:32 +08:00
mark
|