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}')