我有一个关于使用if语句和递归的函数调用的问题。 我有点困惑因为python似乎跳进了if语句块,即使我的函数返回" False"
以下是一个例子:
1 def function_1(#param):
2 if function_2(#param):
3 #do something
4 if x<y:
5 function_1(#different parameters)
6 if x>y:
7 function_1(#different parameters)
我的function_2返回&#34; False&#34;但是python继续第5行的代码。谁能解释这种行为?提前感谢您的任何答案。
编辑:抱歉,忘了括号
具体例子:
1 def findExit(field, x, y, step):
2 if(isFieldFree(field, x, y)):
3 field[y][x] = filledMarker
4 findExit(field, x + 1, y, step+1)
5 findExit(field, x - 1, y, step+1)
6 findExit(field, x, y + 1, step+1)
7 findExit(field, x, y - 1, step+1)
8 elif(isFieldEscape(field, x, y)):
9 way.append(copy.deepcopy(field))
10 wayStep.append(step+1)
def isFieldFree(field, x, y):
if field[y][x] == emptyMarker:
return True
else:
return False
def isFieldEscape(field, x, y):
if field[y][x] == escapeMarker:
return True
else:
return False
在两个函数之后&#34; isFieldFree&#34;和#34; isFieldEscape&#34; return False python继续第5行中的代码,有时在第6行。
答案 0 :(得分:5)
简答:
那是因为你实际上没有调用这个函数。您可以使用括号来调用该函数。
if function2():
...
答案很长:
Python中的函数是一等公民(函数范例),因此仅通过名称来引用函数是完全有效的。以下是有效的语法:
def hello():
print("Hello")
hello_sayer = hello
hello_sayer() # print "Hello"
下一个发挥作用的概念是非布尔变量的真实性。 在Python中,以下内容被视为False-y
其他一切都是真实的。由于函数名称不属于上述类别,因此在条件上下文中进行测试时,它被视为True-ish。
参考:https://docs.python.org/3/library/stdtypes.html#truth-value-testing
编辑:之前的问题不完整,没有函数调用。对于这个新问题,AChampion的回答是正确的。
答案 1 :(得分:0)
您可能会误解递归是如何工作的,是的,它继续在第5行或第6行,因为递归已在调用堆栈中的较低级别结束,因此它在调用堆栈中继续处于更高级别。这是一个示例调用堆栈,请注意False
之后的下一个操作是较高调用堆栈的下一个findExit()
:
1 findExit(...):
2 True:
3 field assignment
4.1 findExit(x+1)
2 True
3 field assignment
4.1 findExit(x+1):
2 False # Does not jump to line 5 in current call stack.
5.1 findExit(x-1):
. ...