Python 理解困难';赋值前引用的局部变量';
有很多帖子都有类似的问题,但即使在浏览之后,我也无法理解背后的逻辑。对不起,我以前从未编程过。下面是两段代码-用于计算阶乘的递归函数。 无论我传递的是1还是任何值,这都会在赋值“之前引用一个错误”局部变量“f”Python 理解困难';赋值前引用的局部变量';,python,Python,有很多帖子都有类似的问题,但即使在浏览之后,我也无法理解背后的逻辑。对不起,我以前从未编程过。下面是两段代码-用于计算阶乘的递归函数。 无论我传递的是1还是任何值,这都会在赋值“之前引用一个错误”局部变量“f” def func(n): if n != 1: f = n*func(n-1) else: return f 但是,当我将代码更改为: def func(n): if n == 1: return
def func(n):
if n != 1:
f = n*func(n-1)
else:
return f
但是,当我将代码更改为:
def func(n):
if n == 1:
return 1
else:
f = n*func(n-1)
return f
没有错误,程序运行正常。
在这两种情况下,我都在赋值之前初始化了变量“f”,并且这两个变量都只是函数的局部变量。只是想弄清楚我的基本概念。谢谢。功能1-
- 在第一个函数中,
在返回时可能仍然未初始化(取决于输入)。第一个函数没有第二个函数的基本情况f
- 假设您传递的参数
不等于1。如果n!=1条件将被评估为n
。那么False
语句在尚未初始化时如何返回else
?因此错误f
职能2-
- 但是,在第二个函数中,在返回它(n>=1)之前,您将始终初始化
,或者进入无限递归(n<1)。不管怎样,在没有初始化的情况下都不会返回它。所以它没有错误f
希望您理解错误发生的原因。考虑此函数:
def func(n):
return f
因为f
不存在,所以很容易理解为什么这个函数会给出错误
在第一个函数中,如果n!=1
计算False
,它的行为与我上面给出的示例函数类似
正如@Mustafa Aydın所评论的,错误与您的
UnboundLocalError
略有不同,但概念仍然存在。在第一个示例中,f
的值从何而来1?如果进入else
分支,请思考第一个示例中会发生什么。在这种情况下,当您返回f
时,它没有定义。在第二个示例中,if
分支返回,而else
分支分配f
,因此如果在第二个程序中没有定义f
,您永远无法到达返回f
,您有两个选择,一个选择返回1
(其中不需要f
)在另一个函数中,您指定了f
。return
语句会立即终止函数,因此不会检查其他变量或语句。如果n==1,您的第一个func(n)
返回什么?在执行流的那个点上是否分配了f
?实际上,错误消息的信息量很大。您可以在函数的开头添加f=1
,它也可以工作。执行时,您的函数func
将给出NameError
notUnboundLocalError
@MustafaAydın-谢谢。我编辑了这个问题来反映这一点。只是为了让它正确-这是否意味着代码应该确保变量在“return”中使用之前已经被赋予了一些值?没错。不过,缩写应该是正确的词。
def func(n):
if n == 1:
return 1
else:
f = n*func(n-1)
return f
def func(n):
return f