雷锤 发表于 2022-11-23 12:44:30

题目求助。关于局部变量赋值前被引用

本帖最后由 雷锤 于 2022-11-24 17:36 编辑

题目内容:

编写程序制作英文词典的维护程序,基本功能包括:添加(修改)、删除和查询。程序中使用字典对象保存数据,其中每一个元素表示一条字典条目,英文单词为元素的键,中文释义为元素的值。程序会根据用户的输入运行相应的功能,并显示相应的运行结果,直到用户输入quit结束程序,具体输入格式如下:
①添加(修改)条目的输入格式为:update 英文单词 中文释义,操作成功返回True,否则返回False。
②删除条目的输入格式为:delete 英文单词,操作成功返回True,否则返回False。
③查询条目的输入格式为:search 英文单词,返回值为对应的中文释义,当查询的单词不存在时,显示“Not Found”。
④退出程序的输入格式为:quit。
⑤如果输入内容不符合以上格式,则提示用户“Error Input”。

输入样例:
update apple 苹果
update banana 香蕉
update peach 桃子
search apple
search banana
search peach
delete peach
search peach
quit



输出样例:
True
True
True
苹果
香蕉
桃子
True
Not Found
————————
上面是题目
我的代码如下
class app():
    def __init__(self):
      self.base={}
    def in_1(self):
      a=input()
      if a=='quit':
            pass
      s=list(a.split(' '))
      if len(s)<2 or len(s)>3:
            if s=='quit' and len(s)==1:            
                pass
            else:
                print('Error Input')
                self.in_1()
      elif len(s)==2:
            if sin ['search','delete']:
                a1=s
                a2=s
            else:
                print('Error Input')
                self.in_1()
      elif len(s)==3:
            if s in ['update']:
                a1=s
                a2=s
                a3=s
            else:
                print('Error Input')
                self.in_1()   
      if a1=='update':
            self.update_1(a2,a3)
            del a1
            self.in_1()
      elif a1=='delete':
            self.delete_1(a2)
            del a1
            self.in_1()
      elif a1=='search':
            self.search_1(a2)
            del a1
            self.in_1()
      else:
            del a1
            self.in_1()
    def update_1(self,a2,a3):
      self.base=a3
      print('True')
    def delete_1(self,a2):
      try:
            del self.base
            print('True')
      except:
            print('False')
    def search_1(self,a2):
      if (a2 in self.base):
            print(self.base)
      else:
            print('False')

if __name__=='__main__':
    a=app()
    a.in_1()


报错原因:UnboundLocalError: local variable 'a1' referenced before assignment,
——————
问题:在进行过update search 后 输入quit 反而会报错,并且之前为什么 输入第二次search的时候不会

jackz007 发表于 2022-11-23 12:54:34

本帖最后由 jackz007 于 2022-11-23 13:01 编辑

    def in_1(self):
      a = input()
      if a == 'quit':
            pass
      s = list(a . split(' '))
      if len(s) < 2 or len(s) > 3 :
            if s == 'quit' and len(s) == 1:      # 此分支没有为 a1 赋值            
                pass                                  # 在这里让 a1 = 'quit' 如何?
            else:
                print('Error Input')
                self.in_1()
      elif len(s)==2:
            if sin ['search','delete']:
                a1=s                           # a1 属于条件赋值
                a2=s
            else:
                print('Error Input')
                self.in_1()
      elif len(s)==3:
            if s in ['update']:
                a1=s                        # a1 属于条件赋值
                a2=s
                a3=s
            else:
                print('Error Input')
                self.in_1()   
      if a1=='update':                         # 在主干通道判断一个属于条件赋值的变量,风险来自这里!!!

zhangjinxuan 发表于 2022-11-23 14:35:14

为什么要写一个类呢,直接一个字典不香吗,楼主是在做题还是在做软件啊

Mefine 发表于 2022-11-23 15:09:01

还是菜鸡阶段,看不懂{:10_266:}

lxping 发表于 2022-11-23 16:00:24

看看

hellometa 发表于 2022-11-23 16:00:57

学习~

tiangtian 发表于 2022-11-23 16:09:35

看看

阿奇_o 发表于 2022-11-23 17:50:38

本帖最后由 阿奇_o 于 2022-11-23 18:02 编辑

题目的意思应该是: 先 所有命令输入完,quit后,再批量处理和输出结果吧,不是单独的输入一条命令就输出一条结果。。
我是这样理解和这样写的:
class App:
    words = dict(apple='苹果', banana='香蕉')   # 初始化,作为测试设包含这两个单词

    def manage_words(self):
      self.cmds = []   # 收集所有命令操作
      while True:
            self.cmds.append(input().strip())
            # print(self.cmds)   # 查看每次(每行)输入命令后, 命令清单
            if self.cmds[-1] == 'quit':
                self.show()   #
                self.cmds.clear()
                break

    def show(self):
      for cmd in self.cmds[:-1]:# 不要最后一条quit命令(上面已经判断处理了)
            stmt = cmd.split()
            if len(stmt) == 3 and stmt == 'update':
                c, word, zh = stmt
                try:
                  self.words = zh
                  print(True, '--Update Successfully')# 更新成功
                except:
                  print(False, '--更新失败?')          # 失败?这会发生吗?

            elif len(stmt) == 2 :
                c, word = stmt
                if c == 'delete':
                  try:
                        self.words.pop(word)
                        print(True, f'--已删除{word}')
                  except:
                        print(False, '--删除失败(该单词未收录在当前字典里)')

                if c == 'search' :
                  print(self.words.get(word, 'Not Found'))    # 用dict.get 省去类似上面try的判断 (补充,查了一下:dict.pop 其实也可以这样 ^_)

            else:
                print('Error Input')


app = App()
app.manage_words()

1molHF 发表于 2022-11-23 18:03:27

学习~

zsy0226 发表于 2022-11-23 19:46:03

学习~

kerln888 发表于 2022-11-24 09:20:32

学习

python.rookie 发表于 2022-11-24 16:58:28

新手表示看不懂hhhhhh还没学那么多

雷锤 发表于 2022-11-24 17:12:29

zhangjinxuan 发表于 2022-11-23 14:35
为什么要写一个类呢,直接一个字典不香吗,楼主是在做题还是在做软件啊

我单纯想试试{:10_285:}

雷锤 发表于 2022-11-24 17:20:30

jackz007 发表于 2022-11-23 12:54


带佬,能不能细说一下,我看不懂{:10_254:},为什么主干通道判断一个属于条件赋值的变量会有风险

zhangjinxuan 发表于 2022-11-24 17:21:41

雷锤 发表于 2022-11-24 17:12
我单纯想试试

azhe

jackz007 发表于 2022-11-24 17:25:24

本帖最后由 jackz007 于 2022-11-24 17:26 编辑

雷锤 发表于 2022-11-24 17:20
带佬,能不能细说一下,我看不懂,为什么主干通道判断一个属于条件赋值的变量会有风险

         条件赋值,那就有可能没有被赋值,一旦真的没有被赋值,判断语句又在主干(必执行)通道上,是一定会判断它的值的,这不就出问题了?

雷锤 发表于 2022-11-24 17:35:40

jackz007 发表于 2022-11-24 17:25
条件赋值,那就有可能没有被赋值,一旦真的没有被赋值,判断语句又在主干(必执行)通道上, ...

好的 感谢

编程追风梦 发表于 2022-11-24 19:04:17

jackz007 发表于 2022-11-23 12:54


没法运行啊,你的第二个else好像出了问题

jackz007 发表于 2022-11-24 19:11:10

编程追风梦 发表于 2022-11-24 19:04
没法运行啊,你的第二个else好像出了问题

       我们没有写代码,代码是楼主的。

编程追风梦 发表于 2022-11-24 19:41:42

jackz007 发表于 2022-11-24 19:11
我们没有写代码,代码是楼主的。

哦....
页: [1]
查看完整版本: 题目求助。关于局部变量赋值前被引用