【问题标题】:UnboundLocalError: local variable 'sumOfOdd' referenced before assignment in Python3UnboundLocalError:在 Python3 中赋值之前引用了局部变量“sumOfOdd”
【发布时间】:2020-07-02 14:58:22
【问题描述】:

我正在尝试运行此代码:

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

我可以跑,但是当我输入任何数字时都会出现这个错误

【问题讨论】:

    标签: python python-3.x cs50


    【解决方案1】:

    出现此错误是因为无法从函数内访问变量 sumOfOdd。你可以声明variable global in the function,但你应该小心使用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
    

    【讨论】:

      【解决方案2】:

      这是您的代码的工作版本。

      请注意,它现在将 credit_num 迭代为 for num in credit_num。如果您使用for i in range(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,3,4,4,4,4],如果您的输入字符串是@ 987654329@

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 2012-11-14
        相关资源
        最近更新 更多