香喷喷的咸鱼 发表于 2021-1-25 16:55:38

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

我的程序是:
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 = 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()



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

请忽略我的注释!

感谢亲爱的鱼油帮我解答。。多谢多谢

jackz007 发表于 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 = 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

香喷喷的咸鱼 发表于 2021-1-25 17:16:11

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

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

谢谢帮我指出问题

jackz007 发表于 2021-1-25 17:18:30

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

      试试我修改的代码

香喷喷的咸鱼 发表于 2021-1-25 17:20:46

jackz007 发表于 2021-1-25 17:18
试试我修改的代码

试了你修改的代码了。。太感谢了!
刚刚我的回复太想当然了,抱歉!
{:10_254:}{:10_254:}{:10_254:}

hrp 发表于 2021-1-25 17:22:24

错误在第9行:
不能用dict1={amount:keys}。你这样对dict1重新赋值,dict1指向了新的内存地址,Python会认为dict1是个局部变量(因为函数内部不能直接修改全局变量),所以报局部变量未定义错误。
应该这样写:
dict1.update({amount:keys}),调用字典的方法来修改dict1的值,这样dict1并没有指向新的内存地址。

香喷喷的咸鱼 发表于 2021-1-25 17:26:15

jackz007 发表于 2021-1-25 17:18
试试我修改的代码

可以帮我解释一下为什么要放在循环内吗

香喷喷的咸鱼 发表于 2021-1-25 17:30:47

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

明白了,谢谢!
再问一下:在函数内部,给一个   全局变量的   字典,序列   增添新的元素。就是对全局变量修改了吗?{:10_254:}

hrp 发表于 2021-1-25 18:03:19

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

值变了就是修改了呗,修改方式有两种,1是直接赋值,这要求先用global声明要重新赋值的变量是全局变量,否则Python默认是局部变量;2是调用全局变量的方法来修改全局变量的值,这不需要global声明。

香喷喷的咸鱼 发表于 2021-1-25 21:05:50

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

好的,谢谢
页: [1]
查看完整版本: python 显示报错 :未解释的引用。。。。和答案应该是一样的吧。。为什么还是报错