python局部变量-我何时必须分配值?

时间:2018-09-11 14:23:08

标签: python global-variables local-variables

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

我发现,当我删除注释“#X = 3”并将其放入下面的代码中时,该代码即可工作。如果没有X = 3,则代码会导致UnboundLocalError。

在线浏览,它与全局变量和局部变量相关,但我看不出它是如何相关的。何时在while循环之前必须表示X?为什么“对于y为质数”不需要预定义“ 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)

3 个答案:

答案 0 :(得分:2)

根据设计模式变量应在使用前创建。在代码中,您正在使用x而不创建或初始化默认值。 “ y” =您正在迭代列表(素数)。因此,在每次迭代中y都会由当前值初始化,因此不会产生任何错误。

答案 1 :(得分:1)

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

粗略翻译为简单的英语:

while x <= num: ==只要此数字小于或等于另一个数字,请执行以下操作

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

希望这不会更加令人困惑

答案 2 :(得分:1)

在使用变量之前,您需要创建一个变量(并为其分配值)。如果尝试在创建变量之前使用变量的值 ,则会出现异常。您可以在while表达式中执行此操作:您询问它的值是否小于或等于num,但它甚至不存在,它没有值,这引发了异常。

现在,您为什么得到UnboundLocalError

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

因此,如果尝试在赋值发生之前访问变量 ,则该变量尚不存在,但是代码已经知道应该是 local 变量,因此为UnboundLocalError

在函数中没有对X任何赋值语句,您将获得NameError,因为在执行while语句期间,解释器将搜索一个此名称的全局变量。