Python: 函数和变量同名
为什么我不能再次调用这个函数?或者,我该怎么做才能再次调用呢?
假设我有这样一个函数:
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 中,你不能同时有两个同名的东西,不管是函数、整数还是其他任何对象。最好使用不同的名字。