在 Python 中重新绑定函数名称

Rebinding Function Name in Python

在Python3中,我尝试了如下代码,结果见注释:

f = max
max = min
print(max(3,4))       # ① prints 3
print(f(3,4))         # ② prints 4
print(max == min)     # ③ prints True
print(max == f)       # ④ prints False
print(min == f)       # ④ prints False

我有以下问题:

  1. 我理解①的结果。它打印 3 因为名称 max 现在绑定到内置 min 函数的作用。就是它 对吧?
  2. 对于 ② 的结果,f 仍然充当 max,即使 max 是 现在实际上是 min。这是因为绑定的第一行 f = max 实际上并没有将 f 绑定到名称 max 而是绑定到 max的内容? (有点像按值传递而不是 通过引用)
  3. 对于④和⑤的结果,为什么都是False?我想在 其中至少有一个是 True.
  1. 是。

  2. 正确,f 绑定到 max 在您进行分配时绑定到的东西。

  3. f 引用了内置的 max 函数,maxmin 都引用了内置的 min 函数。因此 maxmin 都不等同于 f.

>>> f = max
>>> max == f
True
>>> max = min
>>> max == f
False

请注意,您可以使用常规旧整数更轻松地探索这些相同的概念:

>>> a = 2
>>> b = a
>>> a = 3
>>> a, b
(3, 2)

关于(1)和(2),你的理解是正确的。

关于 (3),maxmin 现在都引用内置函数 min,而 f 引用内置函数 max。因此,两者比较 return False.

f = max 名称 f 现在绑定到最大函数

max = min 名称 max 现在绑定到最小函数

更改 max 的值不会更改 f 的值,因此它仍然绑定到最大函数,因此 max == min != f

变量引用对象并且不保留这些对象可能来自何处的记忆。在您的情况下,变量引用函数对象。函数对象本身是匿名的。当你执行

f = max

max 正在引用一个函数对象。赋值后,f 还引用相同的函数对象,其引用计数递增 1。您现在可以对变量 max 执行任何您喜欢的操作。函数对象的引用计数将减 1,但由于它也被 f 引用,它仍然存在。

Python 作为一种友好的语言,在编译时用它的第一个引用标记函数对象。您可以在 print 语句中使用它来查看函数对象的来源。

print('max', max)
f = max
print('f', f)
max = min
print('max', max)
print(max, max(3,4))       # ① prints 3
print(f, f(3,4))         # ② prints 4
print(f, max == min)     # ③ prints True
print(max, f, max == f)       # ④ prints False
print(min, f, min == f)       # ④ prints False

结果

max <built-in function max>
f <built-in function max>
max <built-in function min>
<built-in function min> 3
<built-in function max> 4
<built-in function max> True
<built-in function min> <built-in function max> False
<built-in function min> <built-in function max> False