鱼C论坛

 找回密码
 立即注册
查看: 1507|回复: 4

[已解决]关于字典中的通讯录求教

[复制链接]
发表于 2020-7-15 00:39:01 | 显示全部楼层 |阅读模式

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

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

x
def isUpdateNum(name):
   # global numCard
    isUpdate = input("是否修改用户资料(YES/NO):")
    if isUpdate == "YES":
        upNum = input("请输入用户联系电话:")
        numCard[name] = upNum
        print("修改成功!现在是:" + name + ":" + numCard[name])
    elif isUpdate == "NO":
        print("已放弃修改!")
    else:
        print("请输入正确指令!")
        isUpdateNum(name)


print("I---欢迎进入通讯录程序---I")
print("I---1.查询联系人资料---I")
print("I---2.插入新的联系人---I")
print("I---3.删除已有联系人---I")
print("I---4.退出通讯录程序---I")
flag = 1
numCard = {}
while (flag):
    temp = int(input("请输入相关的指令代码:"))
    if temp == 4:
        '''
        print("I---感谢使用通讯录程序---I")
        flag=0
        '''
        #更优的逻辑写法应该是输入4就跳出循环执行while循环体之外的语句
        break
    elif temp == 1:
        checkName = input("请输入联系人姓名:")
        print(checkName + ":" + numCard.get(checkName, "未存储该用户联系方式!"))
    elif temp == 3:
        checkName = input("请输入联系人姓名:")
        if checkName in numCard.keys():
            del numCard[checkName]
            print("删除成功!")
        else:
            print("删除失败")
    elif temp == 2:
        checkName = input("请输入新增的联系人姓名:")
        if checkName in numCard.keys():
            print("您输入的用户在通讯录中已存在--》" + checkName + ":" + numCard[checkName])
            #循环回上一层,就用函数递归做
            isUpdateNum(checkName)
        else:
            inNum = input("请输入用户联系电话:")
            numCard[checkName] = inNum
    else:
        print("I---请输入正确的指令!---I")
print("I---感谢使用通讯录程序---I")

我上一个帖子提了仨问题,不懂为啥一直提示帖子不存在,于是只能百度了,好说歹说找到了问题,并解决了。关于YES/NO这层"输入不规范字符时让返回上层继续YS/NO"的判断后来也想到可以用函数重复调用做,但是这块有个知识点想请教下大佬们,我写函数时,想着是修改全局变量numCard,怕函数里的操作没修改到全局变量于是加了个global,后来我测试时发现,就算没加global也没影响结果。

大佬们能给解释下为啥不加这个global也能改全局变量numCard吗,不是说没加global改的只是同名的另一个numCard吗?我把global注释掉后修改了下,然后查询,确确实实是修改了numCard的值,函数里修改的那个看着不像是py自动新建的同名字典。
wenti.png
最佳答案
2020-7-15 08:11:36



容器类型的数值是可以给容器内添加、减少元素的 , 比如列表 、字典 都可以直接添加元素

但是你如果改变容器本身就会触发屏蔽机制 ,比如 numCard = {} 重新赋值为一个字典,这时就要用 global 声明这个是全局变量

直接更改容器本身就是类似直接重新赋值了一个和全局变量同名的变量 , 此时触发屏蔽机制

暂时屏蔽外部的全局变量在内部创建个与全局变量同名的局部变量来覆盖局部变量

但是只要一出这个函数 , 这个局部变量就不复存在。但是容器类型的数值不会哈, 允许你更改容器内的元素

但元组只允许你更改元组内列表 或 字典的元素 , 因为元组本身就不支持直接对元组增加和删减元素 ,但是元组内的其他容器可以



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

使用道具 举报

发表于 2020-7-15 08:11:36 | 显示全部楼层    本楼为最佳答案   



容器类型的数值是可以给容器内添加、减少元素的 , 比如列表 、字典 都可以直接添加元素

但是你如果改变容器本身就会触发屏蔽机制 ,比如 numCard = {} 重新赋值为一个字典,这时就要用 global 声明这个是全局变量

直接更改容器本身就是类似直接重新赋值了一个和全局变量同名的变量 , 此时触发屏蔽机制

暂时屏蔽外部的全局变量在内部创建个与全局变量同名的局部变量来覆盖局部变量

但是只要一出这个函数 , 这个局部变量就不复存在。但是容器类型的数值不会哈, 允许你更改容器内的元素

但元组只允许你更改元组内列表 或 字典的元素 , 因为元组本身就不支持直接对元组增加和删减元素 ,但是元组内的其他容器可以



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

使用道具 举报

 楼主| 发表于 2020-7-15 08:38:23 From FishC Mobile | 显示全部楼层
本帖最后由 lamupen 于 2020-7-15 08:39 编辑
Twilight6 发表于 2020-7-15 08:11
容器类型的数值是可以给容器内添加、减少元素的 , 比如列表 、字典 都可以直接添加元素

但是你 ...


大佬,你上面这段我这样理解对吗?
只要我在函数里执行的是numcard的增删,就是直接修改全局变量的值,哪怕是numcard.clear()。但是要是在函数里重新给numcard赋值,就会触发屏蔽,此时通过加global关键字能允许重新赋值的操作修改全局变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 08:39:45 | 显示全部楼层
lamupen 发表于 2020-7-15 08:38
大佬,你上面这段我这样理解对吗?
只要我在函数里执行的是numcard的增删改,就是直接修改全局变量的值 ...


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

使用道具 举报

 楼主| 发表于 2020-7-15 08:41:06 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-7-15 08:39
对的

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 23:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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