鱼C论坛

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

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

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

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

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

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


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


  12. def Examination():
  13.     amount=input('请输入用户名:')
  14.     while 1:
  15.         if amount in dict1.keys():
  16.             keys= input('请输入密码:')
  17.             while 1:
  18.                 if keys==dict1.get(amount):
  19.                     print('欢迎进入系统,请点击右上角的X结束程序!')
  20.                     break
  21.                 else:
  22.                     keys=input('密码错误,请重新输入')
  23.             break
  24.         else:
  25.             amount=input('用户名不存在,请重新输入')





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

  30.     sign=input('请输入指令代码:')
  31.     if sign=='N'or'n':
  32.         Newbuilding()
  33.     elif sign=='E'or'e':
  34.         Examination()
复制代码



答案的程序是:
  1. user_data = {}


  2. def new_user():
  3.     prompt = '请输入用户名:'
  4.     while True:
  5.         name = input(prompt)
  6.         if name in user_data:
  7.             prompt = '此用户名已经被使用,请重新输入:'
  8.             continue
  9.         else:
  10.             break

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


  14. def old_user():
  15.     prompt = '请输入用户名:'
  16.     while True:
  17.         name = input(prompt)
  18.         if name not in user_data:
  19.             prompt = '您输入的用户名不存在,请重新输入:'
  20.             continue
  21.         else:
  22.             break

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


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

  35.     while True:
  36.         chosen = False
  37.         while not chosen:
  38.             choice = input(prompt)
  39.             if choice not in 'NnEeQq':
  40.                 print('您输入的指令代码错误,请重新输入:')
  41.             else:
  42.                 chosen = True

  43.         if choice == 'q' or choice == 'Q':
  44.             break
  45.         if choice == 'n' or choice == 'N':
  46.             new_user()
  47.         if choice == 'e' or choice == 'E':
  48.             old_user()


  49. showmenu()

复制代码


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

请忽略我的注释!

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

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

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

使用道具 举报

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

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

  23. dict1 = {}
  24. while 1:
  25.     print('''|---新建用户:N/n---|
  26.     |---登陆账号:E/e---|
  27.     |---推出程序:Q/q---|''')
  28.     sign = input('请输入指令代码:')
  29.     if sign in ('N','n'):
  30.         Newbuilding()
  31.     elif sign in ('E' , 'e'):
  32.         Examination()
  33.     elif sign in ('Q' , 'q'):
  34.         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, 2024-5-11 02:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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