【问题标题】:variable referenced before assignment error despite it being referenced before assignment尽管在赋值之前引用了变量,但在赋值错误之前引用了它
【发布时间】:2020-02-12 20:08:20
【问题描述】:

这很可能是我的一个错误,因为在开始编码时缺乏技能,但我遇到了以前从未有过的东西,那就是在使用函数并让它们引用其他函数时,变量可以是混淆并产生错误。我需要有人帮助分解正在发生的事情。请帮助并提前感谢您

import os

def main():
  if os.path.exists("Text.txt")==True:
    with open("Text.txt", "r") as f:
      li=[]
      for lines in f:
        li.append(eval(lines))
    for i in range(0, len(li)):
      if i == 0:
        a = li[i]
      elif i == 1:
        b = li[i]
      elif i == 2:
        c = li[i]
      elif i == 3:
        d = li[i]
      else:
        pass
  else:
    open("Text.txt", "w").close
    a=[1]
    b=[2]
    c=[3]
    d=[4]
  menu(a, b, c, d)
def menu(a, b, c, d):
  print(a, b, c, d)

main()

当我运行代码时,会出现一个错误,上面写着: 回溯(最近一次通话最后): 文件“main.py”,第 30 行,在 main() 文件“main.py”,第 26 行,在 main() 中 菜单(a,b,c,d) UnboundLocalError: 赋值前引用了局部变量 'c'

【问题讨论】:

  • edit 包含完整的错误回溯
  • 旁白:您不需要==Trueelif 的整个子句(只需使用else 代替)。
  • @G.Anderson 完成
  • Text.txt的内容是什么?您的代码隐含地假定它有 4 行,但鉴于错误表明 c 未定义,那么它似乎实际上只有两行。 [顺便说一句,编写此逻辑的方法要好得多。]
  • a 为例。如果os.path.exists("Text.txt") 返回True,但文件为空,则永远不会分配a

标签: python function operating-system text-files


【解决方案1】:

变量 c 并不总是在您的代码中定义。

检查例如:

def main():
  c=None
  ...
  if ...
  ...

【讨论】:

    【解决方案2】:
        import os
    
    
    def main():
        a, b, c, d = None,None,None, None # Use None or any other data type you are using
        if os.path.exists("Text.txt"):
            with open("Text.txt", "r") as f:
                li = []
                for lines in f:
                    li.append(eval(lines))
    
            for i in range(0, len(li)):
                if i == 0:
                    a = li[i]
                elif i == 1:
                    b = li[i]
                elif i == 2:
                    c = li[i]
                elif i == 3:
                    d = li[i]
                else:
                    pass
        else:
            open("Text.txt", "w").close
            a = [1]
            b = [2]
            c = [3]
            d = [4]
        menu(a, b, c, d)
    
    
    def menu(a, b, c, d):
        print(a, b, c, d)
    
    main()
    

    在之前定义 a、b、c 和 d,应该可以解决问题。

    【讨论】:

    • 哦,对不起,应该在if之前。我已编辑,现在检查
    • 对我有用,你是否像我在示例中那样定义?
    【解决方案3】:

    在“else”块中,您正在以写入模式打开“Text.txt”,但没有保存任何内容。因此,如果您再次尝试执行该脚本,它将进入“if”块,打开文件并且什么也没有读取。例如,代码没有进入“for”循环,因此无法实例化变量,从而引发错误。您说的错误与“c”变量有关,这可能是由于您在文本文件中写了一些内容但少于 3 行。

    当我在文本文件中写两行时,我尝试了你的代码并获得了这个:

        ---------------------------------------------------------------------------
    UnboundLocalError                         Traceback (most recent call last)
    <ipython-input-41-275a763cfa3b> in <module>()
         28     print(a, b, c, d)
         29 
    ---> 30 main()
    
    <ipython-input-41-275a763cfa3b> in main()
         24         c=[3]
         25         d=[4]
    ---> 26     menu(a, b, c, d)
         27 def menu(a, b, c, d):
         28     print(a, b, c, d)
    
    UnboundLocalError: local variable 'c' referenced before assignment
    

    【讨论】:

      猜你喜欢
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 2018-06-10
      相关资源
      最近更新 更多