鱼C论坛

 找回密码
 立即注册
查看: 3583|回复: 19

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

[复制链接]
发表于 2022-11-23 12:44:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 雷锤 于 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
————————
上面是题目
我的代码如下
  1. class app():
  2.     def __init__(self):
  3.         self.base={}
  4.     def in_1(self):
  5.         a=input()
  6.         if a=='quit':
  7.             pass
  8.         s=list(a.split(' '))
  9.         if len(s)<2 or len(s)>3:
  10.             if s[0]=='quit' and len(s)==1:            
  11.                 pass
  12.             else:
  13.                 print('Error Input')
  14.                 self.in_1()
  15.         elif len(s)==2:
  16.             if s[0]in ['search','delete']:
  17.                 a1=s[0]
  18.                 a2=s[1]
  19.             else:
  20.                 print('Error Input')
  21.                 self.in_1()
  22.         elif len(s)==3:
  23.             if s[0] in ['update']:
  24.                 a1=s[0]
  25.                 a2=s[1]
  26.                 a3=s[2]
  27.             else:
  28.                 print('Error Input')
  29.                 self.in_1()     
  30.         if a1=='update':
  31.             self.update_1(a2,a3)
  32.             del a1
  33.             self.in_1()
  34.         elif a1=='delete':
  35.             self.delete_1(a2)
  36.             del a1
  37.             self.in_1()
  38.         elif a1=='search':
  39.             self.search_1(a2)
  40.             del a1
  41.             self.in_1()
  42.         else:
  43.             del a1
  44.             self.in_1()
  45.     def update_1(self,a2,a3):
  46.         self.base[a2]=a3
  47.         print('True')
  48.     def delete_1(self,a2):
  49.         try:
  50.             del self.base[a2]
  51.             print('True')
  52.         except:
  53.             print('False')
  54.     def search_1(self,a2):
  55.         if (a2 in self.base):
  56.             print(self.base[a2])
  57.         else:
  58.             print('False')

  59. if __name__=='__main__':
  60.     a=app()
  61.     a.in_1()
复制代码



报错原因:UnboundLocalError: local variable 'a1' referenced before assignment,
——————
问题:在进行过update search 后 输入quit 反而会报错,并且之前为什么 输入第二次search的时候不会
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-23 12:54:34 | 显示全部楼层

回帖奖励 +5 鱼币

本帖最后由 jackz007 于 2022-11-23 13:01 编辑
  1.     def in_1(self):
  2.         a = input()
  3.         if a == 'quit':
  4.             pass
  5.         s = list(a . split(' '))
  6.         if len(s) < 2 or len(s) > 3 :
  7.             if s[0] == 'quit' and len(s) == 1:        # 此分支没有为 a1 赋值            
  8.                 pass                                  # 在这里让 a1 = 'quit' 如何?
  9.             else:
  10.                 print('Error Input')
  11.                 self.in_1()
  12.         elif len(s)==2:
  13.             if s[0]in ['search','delete']:
  14.                 a1=s[0]                           # a1 属于条件赋值
  15.                 a2=s[1]
  16.             else:
  17.                 print('Error Input')
  18.                 self.in_1()
  19.         elif len(s)==3:
  20.             if s[0] in ['update']:
  21.                 a1=s[0]                          # a1 属于条件赋值
  22.                 a2=s[1]
  23.                 a3=s[2]
  24.             else:
  25.                 print('Error Input')
  26.                 self.in_1()     
  27.         if a1=='update':                         # 在主干通道判断一个属于条件赋值的变量,风险来自这里!!!
复制代码

评分

参与人数 1鱼币 +5 收起 理由
雷锤 + 5 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-11-23 14:35:14 | 显示全部楼层

回帖奖励 +5 鱼币

为什么要写一个类呢,直接一个字典不香吗,楼主是在做题还是在做软件啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-23 15:09:01 | 显示全部楼层

回帖奖励 +5 鱼币

还是菜鸡阶段,看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-23 16:00:24 | 显示全部楼层

回帖奖励 +5 鱼币

看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-23 16:00:57 | 显示全部楼层

回帖奖励 +5 鱼币

学习~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-23 16:09:35 | 显示全部楼层

回帖奖励 +5 鱼币

看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-23 17:50:38 | 显示全部楼层

回帖奖励 +5 鱼币

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

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

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

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

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

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

  32.             else:
  33.                 print('Error Input')


  34. app = App()
  35. app.manage_words()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-23 18:03:27 | 显示全部楼层

回帖奖励 +5 鱼币

学习~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-23 19:46:03 | 显示全部楼层

回帖奖励 +5 鱼币

学习~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 09:20:32 | 显示全部楼层

回帖奖励 +5 鱼币

学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 16:58:28 | 显示全部楼层
新手表示看不懂hhhhhh还没学那么多
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-24 17:12:29 | 显示全部楼层
zhangjinxuan 发表于 2022-11-23 14:35
为什么要写一个类呢,直接一个字典不香吗,楼主是在做题还是在做软件啊

我单纯想试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-24 17:20:30 | 显示全部楼层

带佬,能不能细说一下,我看不懂,为什么主干通道判断一个属于条件赋值的变量会有风险
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-24 17:21:41 | 显示全部楼层

azhe
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-24 17:25:24 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-24 17:26 编辑
雷锤 发表于 2022-11-24 17:20
带佬,能不能细说一下,我看不懂,为什么主干通道判断一个属于条件赋值的变量会有风险


         条件赋值,那就有可能没有被赋值,一旦真的没有被赋值,判断语句又在主干(必执行)通道上,是一定会判断它的值的,这不就出问题了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

好的 感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-24 19:04:17 | 显示全部楼层

没法运行啊,你的第二个else好像出了问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

       我们没有写代码,代码是楼主的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-24 19:41:42 | 显示全部楼层
jackz007 发表于 2022-11-24 19:11
我们没有写代码,代码是楼主的。

哦....
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 18:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表