【问题标题】:Why is python giving me an unbound local error on introducing new variable inside function?为什么 python 在函数内引入新变量时给我一个未绑定的本地错误?
【发布时间】:2021-01-30 18:08:47
【问题描述】:
x = int(input("Enter the input in seconds "))

def checkSeconds(x):
    
    if x >= 86400:
        d = x/86400
        x = x%86400
        
    if x >= 3600:
        h = x/3600
        x = x%3600
        
    if x >= 60:
        m = x/60
        x = x%60
        
    s = x
    
    print(d, ":", h, ":" , m, ":", s)
    
checkSeconds(x)

错误:'UnboundLocalError: 在赋值之前引用了局部变量 'd'

请多多包涵,因为我是初学者,还在学习。它说'分配前引用的局部变量'd'。请告诉我如何解决此错误。

【问题讨论】:

  • 请始终在您的帖子中包含您从代码中得到的确切错误,逐字逐句。正如你所说,你是一个初学者,很容易歪曲错误或省略一些额外的细节
  • @DanielFarrell 'UnboundLocalError: local variable 'd' referenced before assignment' 这是确切的错误
  • 它的意义远不止于此。当我重现它时,它提供了完整的追溯。明白了吗?您正在寻求我们的帮助,但您忽略了您认为不相关的部分输出。我这样说不是为了抱怨——我是为了提高你的问题和答案的质量
  • @DanielFarrell 我明白你的意思了!谢谢你指出这一点。我会马上修改我的问题

标签: python python-3.x function compiler-errors local-variables


【解决方案1】:

问题是您每次都在打印变量d,但它仅在x >= 86400 时才被定义,在其余情况下变量d 不存在,因此引发UnboundLocalError 异常.

其他变量也会发生同样的情况。

一个简单的解决方案是预先为所有这些设置一个默认值。

def checkSeconds(x):
    d, h, m, s = 0, 0, 0, 0

【讨论】:

  • seconds 实际上不需要设置,因为它不是条件,并且始终设置为输入的其余部分。但是有一个强有力的论据来明确这种行为。
【解决方案2】:

dhx 需要值,即使它们对应的条件(if 语句)不正确。

我还想通过示例向您展示一些其他内容。

我做的第一件事是将除法运算的商转换为整数。否则,在此代码中,小时、分钟和秒也将包括您在余数中实际需要的小数部分。

我在这里做的第二件事是取出input 调用并将其替换为下面的几个硬编码值。这样我就不必一遍又一遍地输入数据,而是一些简单的测试用例可以验证代码是否适合我。许多新程序员喜欢使用键盘与正在运行的代码进行交互。这并没有错,在学术界要求学生在运行时输入值是很常见的,也许只是为了强调代码的行为是动态的。但在现实世界中,实际上提示您的程序进行交互式输入是非常不寻常的,主要是因为它不方便并且容易出现数据输入错误或不一致。这是一种观点,我只是想让您考虑一下。

一旦我这样做了,我就能够定义一些值来测试几个不同的场景。

0: 条件都不匹配 59:条件都不匹配 121: 只有分钟条件匹配 3662:小时、分钟和秒匹配。 882221:所有单位匹配。

通过这些更改,我们现在可以运行代码并获取我们想要的数字

def checkSeconds(x):
    if x >= 86400:
        d = int(x/86400)
        x = x%86400
    else:
      d = 0

    if x >= 3600:
        h = int(x/3600)
        x = x%3600
    else:
      h = 0

    if x >= 60:
        m = int(x/60)
        x = x%60
    else:
      m = 0

    s = x

    print(d, ":", h, ":" , m, ":", s)

for x in [ 0, 59, 121, 3662, 882221 ]:
  checkSeconds(x)

而且由于我对测试用例进行了硬编码,因此很容易使我的结果可重现。

$ python3 ./t.py
0 : 0 : 0 : 0
0 : 0 : 0 : 59
0 : 0 : 2 : 1
0 : 1 : 1 : 2
10 : 5 : 3 : 41

【讨论】:

    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2020-12-02
    相关资源
    最近更新 更多