Python 理解困难';赋值前引用的局部变量';

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

有很多帖子都有类似的问题,但即使在浏览之后,我也无法理解背后的逻辑。对不起,我以前从未编程过。下面是两段代码-用于计算阶乘的递归函数。 无论我传递的是1还是任何值,这都会在赋值“之前引用一个错误”局部变量“f”

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
    在返回时可能仍然未初始化(取决于输入)。第一个函数没有第二个函数的基本情况
  • 假设您传递的参数
    n
    不等于1。如果n!=1条件将被评估为
    False
    。那么
    else
    语句在尚未初始化时如何返回
    f
    ?因此错误

职能2-
  • 但是,在第二个函数中,在返回它(n>=1)之前,您将始终初始化
    f
    ,或者进入无限递归(n<1)。不管怎样,在没有初始化的情况下都不会返回它。所以它没有错误

希望您理解错误发生的原因。

考虑此函数:

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
not
UnboundLocalError
@MustafaAydın-谢谢。我编辑了这个问题来反映这一点。只是为了让它正确-这是否意味着代码应该确保变量在“return”中使用之前已经被赋予了一些值?没错。不过,缩写应该是正确的词。
def func(n):
    if n == 1:
        return 1
    else:        
        f = n*func(n-1)    
    return f
def func(n):
    return f