如果我有两个对象o1和o2,我们就知道了
id(o1) == id(o2)
Run Code Online (Sandbox Code Playgroud)
返回true.
然后,它是否遵循这一点
o1 == o2
Run Code Online (Sandbox Code Playgroud)
或者情况并非如此?我正在研究的论文说情况并非如此,但在我看来应该是真的!
Mik*_*ler 129
不总是:
>>> nan = float('nan')
>>> nan is nan
True
Run Code Online (Sandbox Code Playgroud)
或以与问题中相同的方式制定:
>>> id(nan) == id(nan)
True
Run Code Online (Sandbox Code Playgroud)
但
>>> nan == nan
False
Run Code Online (Sandbox Code Playgroud)
NaN是一件奇怪的事情.根据定义,它不等于也不比自身更大或更大.但它是同一个对象.更多细节为什么所有比较都必须False在这个SO问题中返回.
rec*_*ive 58
这篇论文是对的.考虑以下.
class WeirdEquals:
def __eq__(self, other):
return False
w = WeirdEquals()
print("id(w) == id(w)", id(w) == id(w))
print("w == w", w == w)
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
id(w) == id(w) True
w == w False
Run Code Online (Sandbox Code Playgroud)
tim*_*geb 25
id(o1) == id(o2)并不意味着o1 == o2.
让我们来看看Troll它__eq__总是返回的覆盖False.
>>> class Troll(object):
... def __eq__(self, other):
... return False
...
>>> a = Troll()
>>> b = a
>>> id(a) == id(b)
True
>>> a == b
False
Run Code Online (Sandbox Code Playgroud)
话虽这么说,应该有很在的对象ID匹配,但标准库的几个例子__eq__可以返回False反正荣誉@MarkMüller寻找一个很好的例子.
因此,无论是对象是疯狂的,非常特殊的(如nan),还是并发性的叮咬你.考虑这个极端的例子,其中Foo有一个更合理的__eq__方法('忘记'检查id)并且f is f总是如此True.
import threading
class Foo(object):
def __init__(self):
self.x = 1
def __eq__(self, other):
return isinstance(other, Foo) and self.x == other.x
f = Foo()
class MutateThread(threading.Thread):
def run(self):
while True:
f.x = 2
f.x = 1
class CheckThread(threading.Thread):
def run(self):
i = 1
while True:
if not (f == f):
print 'loop {0}: f != f'.format(i)
i += 1
MutateThread().start()
CheckThread().start()
Run Code Online (Sandbox Code Playgroud)
输出:
$ python eqtest.py
loop 520617: f != f
loop 1556675: f != f
loop 1714709: f != f
loop 2436222: f != f
loop 3210760: f != f
loop 3772996: f != f
loop 5610559: f != f
loop 6065230: f != f
loop 6287500: f != f
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3883 次 |
| 最近记录: |