【问题标题】:python local variable- when do I have to assign a value?python局部变量-我什么时候必须赋值?
【发布时间】:2026-01-18 17:55:02
【问题描述】:

我是一名业余程序员,想在学习代码的同时寻求建议。在这里我遇到了一些问题。

我发现,当我删除注释“#X=3”并将其从下面变成代码时,代码就可以工作了。如果没有 X=3,代码会导致 UnboundLocalError。

在线浏览,它与全局和局部变量有关,但我看不出它是如何相关的。什么时候必须在 while 循环之前表示 X?为什么“for y in primes”不需要预先定义“y”?

代码的主要目的:计算素数的数量到 (num)

def count_primes2(num):
    primes = [2]
    #x = 3
    if num < 2:
        return 0
    while x <= num:
        for y in primes:  # use the primes list!
            if x%y == 0:
                x += 2
                break
        else:
            primes.append(x)
            x += 2
    print(primes)
    return len(primes)

【问题讨论】:

  • 由于您在while循环条件中使用x,是的,它必须在之前定义。
  • for y in primes 本身定义了yfor 循环是一种赋值语句。
  • @SuperStew,所以在 while X 循环之前处理 X 是一种常见的做法?我可以简单确认一下 var 必须在每个 while 循环之前表示吗?
  • @chepner,我明白了。再次感谢

标签: python global-variables local-variables


【解决方案1】:

根据设计模式,变量应该在使用前创建。在代码中,您使用 x 而不创建或初始化默认值。 "y" = 您正在迭代列表(素数)。所以在每次迭代中 y 都会被当前值初始化,所以不会报错。

【讨论】:

    【解决方案2】:

    要扩展,由于您在 while 循环条件中使用 x,是的,它必须在之前定义。您不需要在 for 循环之前定义 y,因为 for y in primes 行将 y 定义为列表中的每个项目。

    粗略翻译成简单的英语:

    while x &lt;= num: == 只要这个数字小于或等于这个其他数字,执行以下操作

    for y in primes == 对每个名为 y 的项目执行以下操作

    希望这不会更令人困惑

    【讨论】:

      【解决方案3】:

      您需要在使用变量之前创建(并为其赋值)。如果您尝试在创建变量之前 使用变量的值,则会出现异常。您在while 表达式中正是这样做的:您询问它的值是否小于或等于num,但它甚至还不存在,它没有值,这引发了异常。

      现在,为什么你会收到UnboundLocalError

      编译器会在代码执行之前检查您的代码。在此编译步骤中,它注意到您在函数中某处X 分配了一个值,即在x += 2 行中。 (甚至有两个。)这将编译器的变量标记为 local 变量。

      因此,如果您尝试在分配发生之前 访问变量,则该变量还不存在,但代码已经知道它应该是一个 local 变量,因此是UnboundLocalError

      如果在函数中没有anyX 的赋值语句,您将获得NameError,因为在执行while 语句期间,解释器会搜索该名称的全局变量。

      【讨论】:

        最近更新 更多