我想知道为什么Python 3.7函数的行为很奇怪。我认为这与hashability的整个概念有点怪异和矛盾。让我澄清一个简单的示例代码所遇到的问题。知道元组是可哈希的,请考虑以下内容:
a = (-1, 20, 8)
b = (-1, 20, 8)
def f(x):
return min(x), max(x)
现在让我们检查:
>>> print(a is b, a.__hash__() == b.__hash__())
False True
>>> print((-1, 20, 8) is (-1, 20, 8))
True
这很奇怪,但是我想“命名”可哈希对象会使它们有所不同(它们在变量定义期间id()
的变化)。功能如何? Functions are hashable,对吧?让我们看看:
>>> print(f(a) is f(b))
False
>>> print(id(f(a)) == id(f(b)), f(a).__hash__() == f(b).__hash__())
True True
现在这是我困惑的高潮。即使f(a) is f(a)
也等于False
,您应该会感到惊讶。但是,如何呢?您不认为这种行为是不正确的,应该由Python社区解决并解决吗?
您不能保证两个相同的调用是相同的,因为函数也是Python中的对象,因此它们可以保持状态:
c = 40
def f(x):
return c + x
a = 1
f(a)
# 41
c += 1
f(a)
# 42
f(a) is f(a)
# True
c += 500
f(a) is f(a)
# False
f(a) is f(a)
可以产生相同的对象,例如,Python将最大不超过255的整数存储为单例,因此第一个测试返回True
,但是当我们不在这些优化(c += 500
)中时,每个调用将实例化其自己的对象返回,现在f(a) is f(a)
将返回False
。