【问题标题】:Python: function and variable with the same namePython:同名的函数和变量
【发布时间】:2014-03-04 02:33:14
【问题描述】:

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

假设我有这个功能:

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”

不能将变量'a'赋给函数吗?

【问题讨论】:

  • 好吧,错误解释了自己。您已将 a 重新定义为 int 而不是 function;现在,a 是一个变量(而不是一个函数);因此后果
  • 我不确定你在问什么。你问为什么不能拨号码?
  • 不,我只想知道:如果可以在赋值“a=2”之后,有办法让“a”再次指向函数。
  • 虽然这对于整天编写 Python 的人来说似乎很明显,但来自 C# 背景的人却很烦人。我可能有一个名为self.a 的“私有”变量,但希望有一个名为a(units='g') 的“公共”函数,它将私有变量“a”上的单位转换为调用者想要的任何单位。相反,我发现我需要将我的“公共”函数写为def format_a(units='g'):
  • 好问题,最后,从答案来看,与其他语言相反,您不能拥有像def x(self): return self.x 这样的getter,您需要以不同的方式命名getter,例如get_x(self)。我来到这里是因为在重构了我的 getter 名称之后,工作代码不再工作了。

标签: python function variables


【解决方案1】:

执行此操作后:

a = 2

a 不再是一个函数,它只是一个整数(你重新分配了它!)。因此,如果您尝试像调用函数一样调用它,解释器自然会抱怨,因为您正在这样做:

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

底线:您不能同时拥有两个具有相同名称的事物,无论是函数、整数还是 Python 中的任何其他对象。只需使用不同的名称即可。

【讨论】:

  • 这种行为是因为python中的一切都是对象(整数和函数都作为对象处理?)还是大多数其他编程语言都如此?
  • 对于 1) 函数是一等公民和 2) 类型是动态的语言来说是正确的;在静态类型语言中,您不能将数字重新分配给声明为存储函数的变量。
【解决方案2】:

names 在 Python 中通常为特定类型的 identifiers,更像是命名一个存储 变量/函数/方法 或 Python 中任何对象的框。当您重新分配时,您只是在重命名一个框。

您可以通过以下操作找到它。

最初,a 在位置 140515915925784 处分配了一个值 9。 只要我对一个函数使用相同的标识符,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
>>>

【讨论】:

    【解决方案3】:

    您将名称 a 分配给函数定义,然后将其重新分配给整数。

    它在语法上是正确的,但它不是你想要的。

    最好给函数提供语义名称来描述你对传递给它们的参数所做的事情,并给变量提供语义名称来描述它们指向的对象。如果你这样做了,你的代码就会更易读,而且你肯定不会再犯这个错误了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2020-09-28
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多