我刚开始学习python并不断收到一个我无法弄清楚的错误。任何帮助都将受到大力赞赏。基本上,我不断收到以下错误:
Enter an int: 8
Traceback (most recent call last):
File "C:\Users\Samuel\Documents\Python Stuff\Find Prime Factors of Number.py", line 16, in <module>
once_cycle()
File "C:\Users\Samuel\Documents\Python Stuff\Find Prime Factors of Number.py", line 8, in once_cycle
while x==0:
UnboundLocalError: local variable 'x' referenced before assignment
我看到很多人都有同样的问题,但当我看到人们告诉他们要做的事情时,我无法理解。无论如何,我的代码是这样的。我已经重新检查了所有缩进,并且看不出它的问题。这个程序的目的是找到一个int的主要因素(虽然它只有90%完成)。它是用Python 2.7.3编写的。
import math
testedInt = float(raw_input("Enter an int: "))
workingInt = testedInt
x = 0
def once_cycle():
for dividor in range(1, int(math.floor(math.sqrt(testedInt))+1)):
while x==0:
print "Called"
if (workingInt%dividor == 0):
workingInt = workingInt/dividor
x = 1
if (workingInt > 1):
once_cycle()
return
once_cycle()
print workingInt
提前感谢您的帮助,
萨姆
答案 0 :(得分:6)
在one_cycle()
功能中,您分配<{1}} :
x
这使 if (workingInt%dividor == 0):
workingInt = workingInt/dividor
x = 1
成为局部变量。你也指的是测试:
x
但在将分配给之前。这是您例外的原因。
在函数的开头添加 while x==0:
,或者将其声明为全局(如果这就是你的意思)。根据它的外观,你不要在函数之外使用x = 0
,所以你可能并不认为它是。
以下作品; x
也正在修改,因此需要声明workingInt
:
global
或简化:
def once_cycle():
global workingInt
x = 0
for dividor in range(1, int(math.floor(math.sqrt(testedInt))+1)):
while x==0:
print "Called"
if (workingInt%dividor == 0):
workingInt = workingInt/dividor
x = 1
if (workingInt > 1):
once_cycle()
return
def once_cycle():
global workingInt
for dividor in range(1, int(math.sqrt(testedInt)) + 1):
while True:
if workingInt % dividor == 0:
workingInt = workingInt / dividor
break
if workingInt > 1:
once_cycle()
已经取代了浮点论证。
请注意,如果int(floating_point_number)
不是 workingInt % dividor
,您最终会遇到无限循环。第一次0
是一个奇数,例如,这会打击你,你的循环永远不会退出。
以testedInt
为例;您将尝试除数11
,1
和2
。虽然3
是除数,但1
将保持workingInt
并且循环中断。下一个11
循环,除数为for
,2
永远不会给你workingInt % 2
,因此循环将永远持续。
答案 1 :(得分:2)
您需要在x
中声明全局变量testedInt
,workingInt
和one_cycle()
才能在那里访问它们:
def once_cycle():
global x
global testedInt
global workingInt
答案 2 :(得分:1)
来自
的x
x = 0
与
中的不同
while x==0:
有关如何在函数内使用全局变量的信息,请参阅Using global variables in a function other than the one that created them。
答案 3 :(得分:1)
您需要在globals
的代码中定义3 once_cycle()
:
由于函数中的变量是静态定义的,而不是在调用函数时定义的。因此python认为变量testedInt
,workingInt
和x
被函数视为本地变量并且它会引发错误。
import math
testedInt = float(raw_input("Enter an int: "))
workingInt = testedInt
x = 0
def once_cycle():
global x
global workingInt
global testedInt
for dividor in range(1, int(math.floor(math.sqrt(testedInt))+1)):
while x==0:
print "Called"
if (workingInt%dividor == 0):
workingInt = workingInt/dividor
x = 1
if (workingInt > 1):
once_cycle()
return
once_cycle()