[英]Why is Python reading my function call as a variable call?
使用Python 2.7.9,这是我的代码:
def secondaction():
secondaction = raw_input(prompt)
if secondaction == "walk through door" or secondaction == "go through door":
print "Well done! You enter the Treasure Room..."
treasure_room()
else:
print "If you don't go through that door you will never leave this cave."
secondaction()
firstact = raw_input(prompt)
global handclenched
def firstaction():
elif firstact == "use sword" and handclenched:
print "You killed the hand giant! A door appears behind it. What will you do?"
secondaction()
当Powershell在将'handclenched'设置为True
进入'使用剑'后带我进入secondaction()
函数时,我输入yh
作为raw_input()
值,并且Powershell提出以下错误消息:
You killed the hand giant! A door appears behind it. What will you do?
> yh
If you don't go through that door you will never leave this cave.
Traceback (most recent call last):
File "ex36game.py", line 168, in <module>
right_room()
File "ex36game.py", line 166, in right_room
firstaction()
File "ex36game.py", line 147, in firstaction
firstaction()
File "ex36game.py", line 153, in firstaction
secondaction()
File "ex36game.py", line 136, in secondaction
secondaction()
TypeError: 'str' object is not callable
但是,当我将代码更改为:
def secondaction():
second_action = raw_input(prompt)
if second_action == "walk through door" or second_action == "go through door":
print "Well done! You enter the Treasure Room..."
treasure_room()
else:
print "If you don't go through that door you will never leave this cave."
secondaction()
一切正常,我没有收到任何错误消息。
为什么Python不能将secondaction()
作为函数调用而不是将调用/调用的代码(这些单词正确吗?)作为raw_input()
分配给的secondfunction
变量secondfunction
?
在Python中,函数是对象,函数名称只是恰好包含函数的变量。 如果您重新分配该名称,它将不再具有您的功能。
因为您在本地范围内重新声明了名称secondaction = raw_input(prompt)
。
因为您写道:
secondaction = raw_input(prompt)
现在, sectionaction
是一个字符串,您不能像对待函数一样调用它。 名称不能同时具有两种含义,并且最新的赋值具有优先权,因此您丢失了对函数的引用。 就像您在有效代码中所做的那样,对其中一个使用不同的名称。
Python为什么不能将'secondaction()'读取为函数调用,而不是调用/调用的代码(这些单词正确吗?)作为'secondfunction'变量
在Python中,函数是变量。 也就是说,函数是一类对象,它们由def
语句分配给变量。 像某些语言一样,可调用函数与可分配变量没有单独的命名空间。
这意味着当您编写secondaction = raw_input(prompt)
您正在函数内部创建一个称为secondaction
的局部变量。 现在,当您在该函数主体中的任何位置编写secondaction
时,都将引用局部变量。 用括号编写secondaction()
并不secondaction()
您访问单独的函数名称空间,它只是尝试调用secondaction
表示的局部变量的值,并且字符串不可调用,因此会出现错误。
这也意味着您可以执行以下操作:
def foo(x):
return x+1
>>> bar= foo
>>> lookup= {'thing': bar}
>>> lookup['thing']
<function foo>
>>> lookup['thing'](1)
2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.