web-dev-qa-db-ja.com

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'オブジェクトは呼び出せません」というエラーが発生します

変数「a」を関数に割り当てることはできませんか?

16
dvsaraiva

これを行った後:

a = 2

afunctionではなく、単なるintegerです(再割り当てしました!)。したがって、当然、インタプリタは、これを実行しているため、関数のように呼び出そうとすると文句を言います。

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

結論:関数、整数、またはPythonの他のオブジェクトであっても、同じ名前の2つのもの同時を使用することはできません。別の名前を使用してください。

25
Óscar López

names in pythonは通常、特定のタイプのidentifiersであり、変数/関数を格納するボックスに名前を付けるようなものです/ methodまたはPythonの任意のオブジェクト。再割り当てするときは、ボックスの名前を変更するだけです。

あなたは以下を行うことでそれを見つけることができます。

最初にaには、場所9で値140515915925784が割り当てられます。関数に同じ識別子を使用するとすぐに、a4512942512でその関数のアドレスを含むボックスを参照するようになります

a3に再割り当てすると、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
>>>
5
durga

関数定義に名前aを割り当ててから、それを整数に再割り当てしています。

それは構文的には正しいですが、あなたが望むものではありません。

関数に渡される引数を使用して何をしているのかを説明する意味論的な名前を関数に与え、どのオブジェクトが指しているのかを説明する変数に意味論的な名前を与えるのが最善です。そうすれば、コードが読みやすくなり、間違いを犯すことはもうありません。

4
Aaron Hall