【问题标题】:local variable referenced before assignment, I can't figure out why this is popping out赋值之前引用的局部变量,我不知道为什么会弹出
【发布时间】:2023-03-29 08:04:01
【问题描述】:

这些是说明: 在公历中,使用三个条件来识别闰年:

年份可以被4整除,是闰年,除非: 年份可以除以 100,它不是闰年,除非: 年份也能被 400 整除。那么就是闰年。

所以我正在编写这段代码,它需要给出一个年份,如果年份是 4 和 400 的倍数,则它是闰年。如果是 100 的倍数,则不是:

def is_leap(year):
    k = 400 % year
    m = 4 % year
    p = 100 % year
    if m == 0:
        if p == 0:
            if k == 0:
                leap = True
            else:
                leap = False
    return leap

year = int(input())
print(is_leap(year))

这是错误信息: UnboundLocalError: 赋值前引用了局部变量'leap'

我不知道为什么不起作用,除了循环内部之外,其他地方都没有使用跳跃

【问题讨论】:

  • 这里没有循环。还想一想:如果m == 0k == 0 为假,leap 会是什么?
  • 您正在从函数返回leap。想想如果m = 1 会发生什么
  • 如果前两个if 语句中的任何一个为假,则永远不会分配leap
  • 另外,你的逻辑是错误的。 2024 年将是闰年,但这不是 100 或 400 的倍数,因此您的代码会给出错误的答案。
  • 逻辑也是错误的,因为你在做400 % year而不是year % 400,等等。

标签: python python-3.x


【解决方案1】:

您只需要定义跳跃,以便在执行未到达最里面的块时它存在。

def is_leap(year):
    k = 400 % year
    m = 4 % year
    p = 100 % year
    leap = False
    if m == 0:
        if p == 0:
            if k == 0:
                leap = True
    return leap

year = int(input())
print(is_leap(year))

编辑:

正如其他人正确指出的那样,代码还存在其他一些问题。以我的经验,日期逻辑比人们预期的要复杂得多,所以我建议不要尝试自己动手:

import calendar
calendar.isleap(year)

Calendar documentation

【讨论】:

  • 也可以只是if m == 0 and p == 0 and k == 0: leap = True...
  • 是的,有几种方法可以做到这一点,但我不想添加有点超出问题范围的样式 cmets。
  • 在这种情况下,Tomeriko 风格的注释是有保证的,因为发布的代码三层嵌套过于复杂。
  • 好的。不过,我并没有说评论不正确或没有根据。这个问题可能是由刚接触编码的人发布的,因此最好不要为仍在努力掌握基础知识的人创建过于复杂的答案。
  • 关于闰年的代码仍然完全错误
【解决方案2】:

您应该在分配任何值之前初始化leap 变量。这就是我认为的问题所在。代码应该是这样的

def is_leap(year):
    leap = False
    k = 400 % year
    m = 4 % year
    p = 100 % year
    leap = False
    if m == 0:
        if p == 0:
            if k == 0:
                leap = True
            else:
                leap = False
    return leap

year = int(input())
print(is_leap(year))

【讨论】:

  • 请注意,else 不是必需的。那么,这和gph的回答一样……
  • 是的。 else 在这种情况下实际上不需要
【解决方案3】:

如果 mp 不等于 0,那么您将返回未初始化的变量。 您可以在第一个if 之前设置leap=False,并完全删除else 语句,代码将按照您的意愿运行。

【讨论】:

    【解决方案4】:

    你的代码有很多错误

    • 400 % year 应该是 year % 400,同样适用于 4100
    • 您可以在if 之前定义leap,以防您没有输入if,因此以后不要定义它

    更重要的是你对闰年的定义是错误的,你的算法是错误的

    def is_leap(year):
        m = year % 4
        p = year % 100
        k = year % 400
        leap = False
        if m == 0:  # should be multiple of 4
            leap = True
            if p == 0:  # exception if multiple of 100 : no leap
                leap = False
                if k == 0:  # exception if multiple of 400 : leap
                    leap = True
        return leap
    

    如果你重新排序条件,你可以避免嵌套它们

    def leapyr(n):
        if n % 400 == 0:
            return True
        if n % 100 == 0:
            return False
        if n % 4 == 0:
            return True
        return False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2017-10-13
      • 2021-02-18
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多