在 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
我有以下问题:
- 我理解①的结果。它打印
3
因为名称 max
现在绑定到内置 min
函数的作用。就是它
对吧?
- 对于 ② 的结果,
f
仍然充当 max
,即使 max
是
现在实际上是 min
。这是因为绑定的第一行
f = max
实际上并没有将 f
绑定到名称 max
而是绑定到
max
的内容? (有点像按值传递而不是
通过引用)
- 对于④和⑤的结果,为什么都是
False
?我想在
其中至少有一个是 True
.
是。
正确,f 绑定到 max
在您进行分配时绑定到的东西。
f
引用了内置的 max
函数,max
和 min
都引用了内置的 min
函数。因此 max
和 min
都不等同于 f
.
>>> f = max
>>> max == f
True
>>> max = min
>>> max == f
False
请注意,您可以使用常规旧整数更轻松地探索这些相同的概念:
>>> a = 2
>>> b = a
>>> a = 3
>>> a, b
(3, 2)
关于(1)和(2),你的理解是正确的。
关于 (3),max
和 min
现在都引用内置函数 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
在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
我有以下问题:
- 我理解①的结果。它打印
3
因为名称max
现在绑定到内置min
函数的作用。就是它 对吧? - 对于 ② 的结果,
f
仍然充当max
,即使max
是 现在实际上是min
。这是因为绑定的第一行f = max
实际上并没有将f
绑定到名称max
而是绑定到max
的内容? (有点像按值传递而不是 通过引用) - 对于④和⑤的结果,为什么都是
False
?我想在 其中至少有一个是True
.
是。
正确,f 绑定到
max
在您进行分配时绑定到的东西。f
引用了内置的max
函数,max
和min
都引用了内置的min
函数。因此max
和min
都不等同于f
.
>>> f = max
>>> max == f
True
>>> max = min
>>> max == f
False
请注意,您可以使用常规旧整数更轻松地探索这些相同的概念:
>>> a = 2
>>> b = a
>>> a = 3
>>> a, b
(3, 2)
关于(1)和(2),你的理解是正确的。
关于 (3),max
和 min
现在都引用内置函数 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