为了账号安全,请及时绑定邮箱和手机立即绑定

难以理解“赋值前引用的局部变量”

难以理解“赋值前引用的局部变量”

素胚勾勒不出你 2023-01-04 11:31:12
有很多帖子有类似的问题,但即使看完它们,我也无法理解背后的逻辑。对不起,我以前从未编程过。下面是两段代码——用于计算阶乘的递归函数。无论我传递 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”,并且两者都只是函数的局部变量。只是想弄清楚我的基本概念。谢谢。
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

函数 1 -

def func(n):  
  if n != 1:
        f = n*func(n-1)
      else:        
        return f
  • 在第一个函数中,f返回时可能仍未初始化(取决于输入)。您的第一个函数没有第二个函数中的基本情况。

  • 假设您传递的参数n不等于 1。if n != 1条件将被评估为Falseelse那么还没有初始化的statement怎么返回f呢?因此错误...


功能 2 -

def func(n):
 if n == 1:  
       return 1
    else:        
        f = n*func(n-1)    
    return f
  • 但是,在您的第二个函数中,您将始终f在返回它之前进行初始化( n >= 1 )或进入无限递归( n < 1 )。无论如何,你不会在没有初始化的情况下返回它。所以它没有给出错误。

希望你明白为什么会出现错误。


查看完整回答
反对 回复 2023-01-04
?
HUWWW

TA贡献1874条经验 获得超12个赞

考虑这个功能:

def func(n): 
   return f

很容易看出为什么这个函数会报错,因为f它不存在。

在您的第一个函数中,如果n != 1evaluates False,它将表现得像我上面给出的示例函数。

正如@Mustafa Aydın 评论的那样,该错误与您的错误略有不同,UnboundLocalError但概念仍然存在。


查看完整回答
反对 回复 2023-01-04
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信