鱼C论坛

 找回密码
 立即注册
查看: 3003|回复: 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
————————
上面是题目
我的代码如下
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[0]=='quit' and len(s)==1:             
                pass
            else:
                print('Error Input')
                self.in_1()
        elif len(s)==2:
            if s[0]in ['search','delete']:
                a1=s[0]
                a2=s[1]
            else:
                print('Error Input')
                self.in_1()
        elif len(s)==3:
            if s[0] in ['update']:
                a1=s[0]
                a2=s[1]
                a3=s[2]
            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[a2]=a3
        print('True')
    def delete_1(self,a2):
        try:
            del self.base[a2]
            print('True')
        except:
            print('False')
    def search_1(self,a2):
        if (a2 in self.base):
            print(self.base[a2])
        else:
            print('False')

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


报错原因:UnboundLocalError: local variable 'a1' referenced before assignment,
——————
问题:在进行过update search 后 输入quit 反而会报错,并且之前为什么 输入第二次search的时候不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

本帖最后由 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[0] == 'quit' and len(s) == 1:        # 此分支没有为 a1 赋值            
                pass                                  # 在这里让 a1 = 'quit' 如何?
            else:
                print('Error Input')
                self.in_1()
        elif len(s)==2:
            if s[0]in ['search','delete']:
                a1=s[0]                           # a1 属于条件赋值
                a2=s[1]
            else:
                print('Error Input')
                self.in_1()
        elif len(s)==3:
            if s[0] in ['update']:
                a1=s[0]                          # a1 属于条件赋值
                a2=s[1]
                a3=s[2]
            else:
                print('Error Input')
                self.in_1()     
        if a1=='update':                         # 在主干通道判断一个属于条件赋值的变量,风险来自这里!!!

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

回帖奖励 +5 鱼币

为什么要写一个类呢,直接一个字典不香吗,楼主是在做题还是在做软件啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

还是菜鸡阶段,看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

学习~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

本帖最后由 阿奇_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[0] == 'update':
                c, word, zh = stmt
                try:
                    self.words[word] = 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() 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

学习~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

学习~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 16:58:28 | 显示全部楼层
新手表示看不懂hhhhhh还没学那么多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我单纯想试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

带佬,能不能细说一下,我看不懂,为什么主干通道判断一个属于条件赋值的变量会有风险
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

azhe
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

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

好的 感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

没法运行啊,你的第二个else好像出了问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

       我们没有写代码,代码是楼主的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哦....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 13:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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