这是我编写的代码,用于从重复的次数中获取数字总和,直到总和低于10:
T = int(input())
for i in range(T):
N = int(input())
def P():
M = [int(d) for d in str(N)]
N = sum(M)
if N<10:
print(N)
else :
return P()
P()
在运行此代码时,它给我一个错误,例如:
Traceback (most recent call last):
File"C:/Users/AdityaShrivastava/AppData/Roaming/Python/Python36/Scripts/tes
ting.py", line 11, in <module>
P()
File "C:/Users/Aditya
Shrivastava/AppData/Roaming/Python/Python36/Scripts/testing.py", line 5, in
P
M = [int(d) for d in str(N)]
UnboundLocalError: local variable 'N' referenced before assignment
答案 0 :(得分:1)
python中的函数声明了一个新范围,这就是N
在您的函数中不可见的原因。您可以通过将N
传递到内部范围来避免这种情况,如下所示:
T = int(input())
for i in range(T):
N = int(input())
def P(N):
M = [int(d) for d in str(N)]
N = sum(M) # this line was the actual culprit
if N<10:
print(N)
else :
return P(N)
P(N)
>>> 1 # test one time
>>> 12345 # cross total of 121212
6
Python在写操作上比较保守。仅从外部作用域变量中读取是可以的,但是重新分配名称N
(如果您写N = sum(M)
会发生这种情况)使它严格检查 local 该名称的变量。
因此,它进一步假设尚未声明的变量是您要从其上方的行中读取的位置-实际上,这有点误导。
有关python中作用域和名称空间的更多信息,请检查here。
答案 1 :(得分:1)
您获得的UnboundLocalError: local variable 'N' referenced before assignment
是由于在函数P()
中使用了N,而没有对其进行声明和初始化。
N = int(input())
在循环内,但不在P()
的范围内。循环中的最后一行P()
将调用函数P()
,而不是返回到N = int(input())
,在该位置应已分配N。
我已将代码修改为
T = int(input())
for i in range(T):
N = int(input())
def P(N):
M = [int(d) for d in str(N)]
N = sum(M)
if N<10:
print(N)
else :
return P(N)
P(N)
答案 2 :(得分:1)
您可以通过在P函数中传递N作为参数来解决此问题。
T = int(input())
for i in range(T):
N = int(input())
def P(n):
M = [int(d) for d in str(n)]
n = sum(M)
if n<10:
print(n)
else :
P(n)
P(N)
如果您在函数P中设置N的值,python会将其理解为使用该名称创建局部变量。该局部变量掩盖了在函数外部使用的全局变量N。因此,最好将N作为参数传递给函数P。
谢谢。
答案 3 :(得分:1)
您正在使用递归来解决此问题。简单地使用循环会更有效:
def gimmeNumber(text):
""""Helper: Asks for input until valid integer number is inputted. Retuns the number"""
while True:
T = input(text).strip()
if T and T.isdigit():
T = int(T)
break
print("Thats not a number ...")
return T
def sumDigits(number):
return sum(int(x) for x in str(number))
T = gimmeNumber("How many numbers? ")
for _ in range(T):
s = 0
N = gimmeNumber("Give me a number: ")
# calculate the cross-sum
s = sumDigits(N)
while s > 9: # repeat while greater then 9
s = sumDigits(s)
print(s)
输入:4,然后是999,888,333,111
输出:
9
6
9
3
@Arne建议将gimmeNumber(text)
改为使用try/except
,而更适合python Ask forgiveness not permission的思维方式,我同意。
仍然,上述变体也可以使用,对于初学者来说更容易理解。这是try/except
之一:
def gimmeNumber(text):
""""Helper: Asks for input until valid integer number is inputted. Retuns the number"""
while True:
try:
T = int(input(text).strip())
break
except ValueError as e:
print("Thats not a number ...")
return T
有关输入验证的更多信息,建议您在Asking the user for input until they give a valid response的答案中进行阅读。