我是一名业余程序员,想在学习代码的同时寻求建议。在这里,我遇到了一些问题。
我发现,当我删除注释“#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)
答案 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
语句期间,解释器将搜索一个此名称的全局变量。