UnboundLocalError:分配前引用了局部变量'i'。 那是我从代码中得到的错误,但是我的“ i”仍然在本地范围内。
功能因子2(n)本身起作用。但是当放入for循环时,会引发错误。我知道这背后有东西,但我不知道。
def tri_num(n):
return n * (n + 1) // 2
def factors2(n):
f_ = 1
for i in range(2, int(n ** .5) + 1):
count_ = 0
while n % i == 0:
count_ += 1
n /= i
if count_ != 0:
f_ *= count_ + 1
else:
if n > i:
f_ *= 2
return f_
import itertools
for n in itertools.count(1):
m = tri_num(n)
q= factors2(m)
if q > 500:
print(m,q)
break
*
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-52-07bebaa60ddd> in <module>()
2 for n in itertools.count(1):
3 m = tri_num(n)
----> 4 q= factors2(m)
5 if q > 500:
6 print(m,q)
<ipython-input-51-214ce9ab60ad> in factors2(n)
9 f_ *= count_ + 1
10 else:
---> 11 if n > i:
12 f_ *= 2
13 return f_
UnboundLocalError: local variable 'i' referenced before assignment
*
'else:'是for循环的一部分,它不应引发错误
s = factors2(81)
print(s)
给我我的答案“ 5”,没错。
我的脚本应该起作用,并给我两个数字
更新:谢谢,我想通了。这是我factor2()中的一个错误,当n = 0、1和2时,它无法运行。
答案 0 :(得分:1)
您要遍历一个空范围,这意味着在您进入i
循环的for
子句之前,从未分配else
。
例如,由count
产生的第一个值是1。然后是tri_num(1) == 1
,因此factors2
被n == 1
调用。这导致对range(2, int(1**.5)+1)
的调用,从而导致range(2,2)
的确为空。由于迭代器从不产生值,因此从未分配i
并输入else
子句,在此假设i
确实具有值。 QED。