鱼C论坛

 找回密码
 立即注册
查看: 2774|回复: 9

[已解决]python 显示报错 :未解释的引用。。。。和答案应该是一样的吧。。为什么还是报错

[复制链接]
发表于 2021-1-25 16:55:38 | 显示全部楼层 |阅读模式

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

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

x
我的程序是:
dict1 = {}  # 函数内部存储的字典是否全局可以使用?


def Newbuilding():
    amount=input('请输入用户名:')
    while 1:
        if amount not in dict1 :              #检索是否存在(在整个范围内的键)  用key的方法
            keys = input('请输入密码:')
            dict1={amount:keys}
            print('注册成功,赶紧试试登陆吧(*^_^*)!')
            break
        else:
            amount=input('此用户名已经被使用,请重新输入:')


def Examination():
    amount=input('请输入用户名:')
    while 1:
        if amount in dict1.keys():
            keys= input('请输入密码:')
            while 1:
                if keys==dict1.get(amount):
                    print('欢迎进入系统,请点击右上角的X结束程序!')
                    break
                else:
                    keys=input('密码错误,请重新输入')
            break
        else:
            amount=input('用户名不存在,请重新输入')





while 1:
    print('''|---新建用户:N/n---|
    |---登陆账号:E/e---|
    |---推出程序:Q/q---|''')

    sign=input('请输入指令代码:')
    if sign=='N'or'n':
        Newbuilding()
    elif sign=='E'or'e':
        Examination()


答案的程序是:
user_data = {}


def new_user():
    prompt = '请输入用户名:'
    while True:
        name = input(prompt)
        if name in user_data:
            prompt = '此用户名已经被使用,请重新输入:'
            continue
        else:
            break

    passwd = input('请输入密码:')
    user_data[name] = passwd
    print('注册成功,赶紧试试登录吧^_^')


def old_user():
    prompt = '请输入用户名:'
    while True:
        name = input(prompt)
        if name not in user_data:
            prompt = '您输入的用户名不存在,请重新输入:'
            continue
        else:
            break

    passwd = input('请输入密码:')
    pwd = user_data.get(name)
    if passwd == pwd:
        print('欢迎进入XXOO系统,请点右上角的X结束程序!')
    else:
        print('密码错误!')


def showmenu():
    prompt = '''
|--- 新建用户:N/n ---|
|--- 登录账号:E/e ---|
|--- 推出程序:Q/q ---|
|--- 请输入指令代码:'''

    while True:
        chosen = False
        while not chosen:
            choice = input(prompt)
            if choice not in 'NnEeQq':
                print('您输入的指令代码错误,请重新输入:')
            else:
                chosen = True

        if choice == 'q' or choice == 'Q':
            break
        if choice == 'n' or choice == 'N':
            new_user()
        if choice == 'e' or choice == 'E':
            old_user()


showmenu()

我的第七行,和答案的第八行   同样是检索 全局变量字典。。为什么我的就报错了

请忽略我的注释!

感谢亲爱的鱼油帮我解答。。多谢多谢
最佳答案
2021-1-25 17:05:32
本帖最后由 jackz007 于 2021-1-25 17:18 编辑
def Newbuilding():
    while 1:
        amount=input('请输入用户名:')   # 必须把此句放入循环
        if amount not in dict1 :              #检索是否存在(在整个范围内的键)  用key的方法
            keys = input('请输入密码:')
            dict1[amount] = keys
            print('注册成功,赶紧试试登陆吧(*^_^*)!')
            break
        else:
            amount=input('此用户名已经被使用,请重新输入:')

def Examination():
    while 1:
        amount = input('请输入用户名:')  # 必须把此句放入循环
        if amount in dict1.keys():
            keys = input('请输入密码:')
            if keys == dict1 . get(amount):
                print('欢迎进入系统,请点击右上角的X结束程序!')
                break
            else:
                keys = input('密码错误,请重新输入')
        else:
            amount=input('用户名不存在,请重新输入')

dict1 = {}
while 1:
    print('''|---新建用户:N/n---|
    |---登陆账号:E/e---|
    |---推出程序:Q/q---|''')
    sign = input('请输入指令代码:')
    if sign in ('N','n'):
        Newbuilding()
    elif sign in ('E' , 'e'):
        Examination()
    elif sign in ('Q' , 'q'):
        break
222.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-25 17:05:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-25 17:18 编辑
def Newbuilding():
    while 1:
        amount=input('请输入用户名:')   # 必须把此句放入循环
        if amount not in dict1 :              #检索是否存在(在整个范围内的键)  用key的方法
            keys = input('请输入密码:')
            dict1[amount] = keys
            print('注册成功,赶紧试试登陆吧(*^_^*)!')
            break
        else:
            amount=input('此用户名已经被使用,请重新输入:')

def Examination():
    while 1:
        amount = input('请输入用户名:')  # 必须把此句放入循环
        if amount in dict1.keys():
            keys = input('请输入密码:')
            if keys == dict1 . get(amount):
                print('欢迎进入系统,请点击右上角的X结束程序!')
                break
            else:
                keys = input('密码错误,请重新输入')
        else:
            amount=input('用户名不存在,请重新输入')

dict1 = {}
while 1:
    print('''|---新建用户:N/n---|
    |---登陆账号:E/e---|
    |---推出程序:Q/q---|''')
    sign = input('请输入指令代码:')
    if sign in ('N','n'):
        Newbuilding()
    elif sign in ('E' , 'e'):
        Examination()
    elif sign in ('Q' , 'q'):
        break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-25 17:16:11 | 显示全部楼层
jackz007 发表于 2021-1-25 17:05
这是一个死循环,你得把改变 amount 的手段 amount=input('请输入用户名:') 放进循环呀,否则,什么 ...

1.我本想的是  运行else后 (给amount 赋值),再循环一次,只要此时的amount 是字典里的key,那就可以跳出循环啦!
2.我主要想知道我的  第七行的   dict1  应该怎么改

谢谢帮我指出问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-25 17:18:30 | 显示全部楼层
香喷喷的咸鱼 发表于 2021-1-25 17:16
1.我本想的是  运行else后 (给amount 赋值),再循环一次,只要此时的amount 是字典里的key,那就可以跳 ...

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

使用道具 举报

 楼主| 发表于 2021-1-25 17:20:46 | 显示全部楼层
jackz007 发表于 2021-1-25 17:18
试试我修改的代码

试了你修改的代码了。。太感谢了!
刚刚我的回复太想当然了,抱歉!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-25 17:22:24 From FishC Mobile | 显示全部楼层
错误在第9行:
不能用dict1={amount:keys}。你这样对dict1重新赋值,dict1指向了新的内存地址,Python会认为dict1是个局部变量(因为函数内部不能直接修改全局变量),所以报局部变量未定义错误。
应该这样写:
dict1.update({amount:keys}),调用字典的方法来修改dict1的值,这样dict1并没有指向新的内存地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-25 17:26:15 | 显示全部楼层
jackz007 发表于 2021-1-25 17:18
试试我修改的代码

可以帮我解释一下  为什么要放在循环内吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-25 17:30:47 | 显示全部楼层
hrp 发表于 2021-1-25 17:22
错误在第9行:
不能用dict1={amount:keys}。你这样对dict1重新赋值,dict1指向了新的内存地址,Python会认 ...

明白了,谢谢!
再问一下:在函数内部,  给一个   全局变量的   字典,序列   增添新的元素。就是对全局变量修改了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-25 18:03:19 From FishC Mobile | 显示全部楼层
香喷喷的咸鱼 发表于 2021-1-25 17:30
明白了,谢谢!
再问一下:在函数内部,  给一个   全局变量的   字典,序列   增添新的元素。就是对全 ...

值变了就是修改了呗,修改方式有两种,1是直接赋值,这要求先用global声明要重新赋值的变量是全局变量,否则Python默认是局部变量;2是调用全局变量的方法来修改全局变量的值,这不需要global声明。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-25 21:05:50 | 显示全部楼层
hrp 发表于 2021-1-25 18:03
值变了就是修改了呗,修改方式有两种,1是直接赋值,这要求先用global声明要重新赋值的变量是全局变量, ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 19:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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