为什么函数不保留身份?

问题描述 投票:3回答:1

我想知道为什么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 function tuples equality hashable
1个回答
0
投票

您不能保证两个相同的调用是相同的,因为函数也是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

© www.soinside.com 2019 - 2024. All rights reserved.