UnboundLocalError:局部变量';sumOfOdd';在Python3中的赋值之前引用
我正在尝试运行以下代码:UnboundLocalError:局部变量';sumOfOdd';在Python3中的赋值之前引用,python,python-3.x,cs50,Python,Python 3.x,Cs50,我正在尝试运行以下代码: number = input("Number: ") valid = False sumOfOdd = 0 def validation(credit_num): for i in range(len(credit_num)): if i % 2 != 0: sumOfOdd += i def main(): print(f"Your credit card number is
number = input("Number: ")
valid = False
sumOfOdd = 0
def validation(credit_num):
for i in range(len(credit_num)):
if i % 2 != 0:
sumOfOdd += i
def main():
print(f"Your credit card number is {number}, it's third digit is {number[2]}")
print(f'sum of odds: {sumOfOdd}')
validation(number)
main()
但我得到了这个错误:
Traceback (most recent call last):
File "credit.py", line 15, in <module>
validation(number)
File "credit.py", line 8, in validation
sumOfOdd += i
UnboundLocalError: local variable 'sumOfOdd' referenced before assignment
回溯(最近一次呼叫最后一次):
文件“credit.py”,第15行,在
验证(编号)
验证中的第8行文件“credit.py”
sumOfOdd+=i
UnboundLocalError:赋值前引用了局部变量“sumOfOdd”
我可以运行,但当我输入任何数字时,它会给我此错误此错误发生,因为无法从函数中访问变量
sumOfOdd
。您可以声明,但使用global
语句时应小心
在我看来,更好的方法是提供sumOfOdd
作为函数的参数,并返回更新后的变量:
def validation(credit_num, sumOfOdd):
for i in range(len(credit_num)):
if i % 2 != 0:
sumOfOdd += i
return sumOfOdd
validation(number, 0)
# Returns the correct sum.
或者,如果您知道sumOfOdd
应始终由零初始化,则可以在本地定义变量:
def validation(credit_num):
sumOfOdd = 0
for i in range(len(credit_num)):
if i % 2 != 0:
sumOfOdd += i
return sumOfOdd
这是您的代码的工作版本 请注意,它现在在credit\u num中以
的形式对num进行迭代。如果对范围内的i(len(credit_num))使用,
您正在迭代索引列表,需要使用If int(credit_num[i])%2!=0
,原因是range(N)
返回一个列表[0,1,2…N-1]
,其中for num in credit_num
迭代[1,1,1,1,2,2,2,2,3,3,3,4,4]
,如果输入字符串是1111222233334444
number = input("Number: ")
valid = False
sumOfOdd = 0
def validation(credit_num):
global sumOfOdd
for num in credit_num:
if int(num) % 2 != 0:
sumOfOdd += 1
def main():
print(f"Your credit card number is {number}, it's third digit is {number[2]}")
print(f'sum of odds: {sumOfOdd}')
validation(number)
main()
请注意,validation(number)
与main()
一起在全局范围内调用,因此内部的global sumOfOdd
声明允许def validation
访问该变量
编写此代码以提高可读性的另一种方法是:
if __name__ == "__main__":
number = input("Number: ")
valid = False
sumOfOdd = 0
def validation(credit_num):
sumOfOddToReturn = 0
for num in credit_num:
if int(num) % 2 != 0:
sumOfOddToReturn += 1
return sumOfOddToReturn
sumOfOdd = validation(number)
print(f"Your credit card number is `{number}`, its third digit is `{number[2]}`.")
print(f'sum of odds: {sumOfOdd}')