Python: 函数和变量同名

25 投票
3 回答
38328 浏览
提问于 2025-04-17 20:42

为什么我不能再次调用这个函数?或者,我该怎么做才能再次调用呢?

假设我有这样一个函数:

def a(x, y, z):
 if x:
     return y
 else:
     return z

然后我用下面的方式调用它:

print a(3>2, 4, 5)

结果是4。

但是想象一下,我不小心声明了一个和这个函数同名的变量:

a=2

现在,如果我尝试这样做:

a=a(3>4, 4, 5)

或者:

a(3>4, 4, 5)

我会收到这个错误:“TypeError: 'int' object is not callable”(类型错误:'int'对象不可调用)。

那我就不能把变量'a'赋值给这个函数吗?

3 个回答

4

你把名字a给了一个函数的定义,然后又把它重新赋值为一个整数。

这样写在语法上是对的,但这不是你想要的结果。

最好给函数起一些有意义的名字,这样能描述你在用传入的参数做什么;而给变量起名字时,也要让人明白它指向的是什么对象。如果你这样做,你的代码会更容易读懂,而且肯定不会再犯这个错误。

8

在Python中, names 通常是用来标识特定类型的东西,更像是给一个装着 变量/函数/方法 或其他对象的盒子起个名字。当你重新赋值的时候,其实就是在给这个盒子换个名字。

你可以通过下面的方式来理解这一点。

最开始,a 被赋值为 9,存放在地址 140515915925784。当我用同样的名字给一个函数时,a 现在指向一个装着 那个函数地址 的盒子,地址是 4512942512

再把 a 赋值为 3,这又让 a 指向了一个不同的地址。

>>> a = 9
>>> id(a)
140515915925784
>>> def a(x):
...     return x
...
>>> id(a)
4512942512
>>> a
<function a at 0x10cfe09b0>
>>>
>>>
>>>
>>> a = 3
>>> id(a)
140515915925928
>>> a
3
>>>
35

在你执行了这个操作之后:

a = 2

a 不再是一个 函数,而只是一个 整数(你把它重新赋值了!)。所以如果你试图像调用函数那样去使用它,解释器自然会报错,因为你实际上是在做这个:

2()
=> TypeError: 'int' object is not callable

总结一下:在 Python 中,你不能同时有两个同名的东西,不管是函数、整数还是其他任何对象。最好使用不同的名字。

撰写回答