Я пишу код, который должен найти простую факторизацию чисел. Основная функция увеличивается через числа; Я делаю это, потому что я хочу использовать код для проведения временных экспериментов. Я не возражаю, что это не суперэффективно, часть проекта для меня будет более эффективной. Он еще не полностью завершен.Переменная, на которую ссылается перед ошибкой присваивания в простой программе факторизации?
import math
import time
primfac=[]
def primcheck(n):
for x in xrange(2, int(n**0.5)+1):
if n % x == 0:
return False
return True
def primes(n):
sieve = [True] * n
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i]:
sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
return [2] + [i for i in xrange(3,n,2) if sieve[i]]
def factfind(lsp,n): #finds factors of n among primes
for i in lsp:
if n%i==0:
primfac.append(i)
else:
i+=1
def simplify(lsp, n):
x = 1
for i in lsp:
x=i*x
if x != n:
print "needs exponent, computing"
for i in lsp:
y=n/i
if primcheck(y) == True:
lsp.append(y)
else:
lsp.append(factfind(primes,y))
def primfacfind(n1,n2):
while n1 <= n2:
time_start = time.clock()
if primcheck(n1) == True:
print "prime"
time_elapsed = time.clock() - time_start
print "time:", time_elapsed
n1+=1
else:
n = n1
print "starting #", n
factfind(primes(n),n)
print primfac
del primfac
primfac[:] = []
simplify(primfac, n)
time_elapsed = time.clock() - time_start
print "time:", time_elapsed
n1+=1
primfacfind(6,15)
Когда я запускаю код, он дает следующее сообщение об ошибке:
Traceback (most recent call last):
File "python", line 65, in <module>
File "python", line 54, in primfacfind
UnboundLocalError: local variable 'primfac' referenced before assignment
Что я не понимаю, потому что я проверил все функции, кроме функции simplify
и даже тогда только новая часть это линии после print
.
Проблема заключается в вашей строке 'del primfac' в' primefacfind'. Это позволяет компилятору присваивать переменную '' primefac' 'как локальную переменную, но поскольку локальная переменная 'primefac' не создана, вы получаете * ошибку времени выполнения *' UnboundLocalError: локальная переменная' primfac ', на которую ссылаются перед присваиванием ' –
Так вот почему 'print primfac' в блоке' else' в 'primefacfind' бросает ошибку. –
Так, например, я думаю, что вместо того, чтобы 'del primefac', вместо того, чтобы' del primefac', вместо этого следует использовать 'primefac.clear()', потому что последнее заставит компилятор обрабатывать 'primefac' как локальную переменную. –