lamupen 发表于 2020-7-15 00:39:01

关于字典中的通讯录求教

def isUpdateNum(name):
   # global numCard
    isUpdate = input("是否修改用户资料(YES/NO):")
    if isUpdate == "YES":
      upNum = input("请输入用户联系电话:")
      numCard = upNum
      print("修改成功!现在是:" + name + ":" + numCard)
    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
            print("删除成功!")
      else:
            print("删除失败")
    elif temp == 2:
      checkName = input("请输入新增的联系人姓名:")
      if checkName in numCard.keys():
            print("您输入的用户在通讯录中已存在--》" + checkName + ":" + numCard)
            #循环回上一层,就用函数递归做
            isUpdateNum(checkName)
      else:
            inNum = input("请输入用户联系电话:")
            numCard = inNum
    else:
      print("I---请输入正确的指令!---I")
print("I---感谢使用通讯录程序---I")


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

大佬们能给解释下为啥不加这个global也能改全局变量numCard吗,不是说没加global改的只是同名的另一个numCard吗?我把global注释掉后修改了下,然后查询,确确实实是修改了numCard的值,函数里修改的那个看着不像是py自动新建的同名字典。{:10_266:}

Twilight6 发表于 2020-7-15 08:11:36




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

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

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

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

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

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



lamupen 发表于 2020-7-15 08:38:23

本帖最后由 lamupen 于 2020-7-15 08:39 编辑

Twilight6 发表于 2020-7-15 08:11
容器类型的数值是可以给容器内添加、减少元素的 , 比如列表 、字典 都可以直接添加元素

但是你 ...

大佬,你上面这段我这样理解对吗?
只要我在函数里执行的是numcard的增删,就是直接修改全局变量的值,哪怕是numcard.clear()。但是要是在函数里重新给numcard赋值,就会触发屏蔽,此时通过加global关键字能允许重新赋值的操作修改全局变量。

Twilight6 发表于 2020-7-15 08:39:45

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


对的

lamupen 发表于 2020-7-15 08:41:06

Twilight6 发表于 2020-7-15 08:39
对的

感谢指导。
页: [1]
查看完整版本: 关于字典中的通讯录求教