技术韭菜 2023-05-09 23:37 采纳率: 58.7%
浏览 24
已结题

关于列表和字典的问题


index_num = persion_info.index(i)
                        dict_cur_perinfo = persion_info[index_num]
                        for title, info in dict_cur_perinfo.items():
                            print(title + ':' + info)
                            modi_name = input('请输入新的姓名:')
                            modi_phone = input('请输入新的手机号:')
                            modi_email = input('请输入新的邮箱:')
                            modi_address = input('请输入新的地址:')
                            dict_cur_perinfo.update(姓名=modi_name)
                            dict_cur_perinfo.update(手机号=modi_phone)
                            dict_cur_perinfo.update(电子邮箱=modi_email)
                            dict_cur_perinfo.update(联系地址=modi_address)
                            print(persion_info)

这段代码中persion_info是一个列表,dict_cur_perinfo是一个字典,将字典放入带列表中,然后通过下标调取列表persion_info中的字典,然后赋值给dict_cur_perinfo,然后通过updatedict_cur_perinfo进行一些更改。

问题是:对dict_cur_perinfo的更改最后还传到了列表persion_info中,这是什么原因?感觉只是对字典dict_cur_perinfo做的更改啊,列表只是将自己的元素赋值给dict_cur_perinfo了。

以下是完整的代码,仅做参考

# 定义一个列表来存通信人的信息,列表的每一个元素代表一个通讯人
persion_info = []
# 展示通讯录的功能
print('=' * 20)
print('欢迎使用通讯录')
print('1.添加联系人')
print('2.查看通讯录')
print('3.删除联系人')
print('4.修改联系人')
print('5.查找联系人')
print('6.退出')
print('=' * 20)
# 设计一个循环来输入、修改、查询等通信人的信息
while True:
    # 虽然使用列表存储信息,但是每条信息都是字典
    # 在列表里存储字典
    per_dict = {}
    # 定义一个变量来接受需要的功能序号
    fun_num = input('请输入功能序号:')
    if fun_num == '1':
        per_name = input('请输入联系人姓名:')
        per_phone = input('请输入联系人的手机号码:')
        per_email = input('请输入联系人的邮箱:')
        per_address = input('请输入联系人的地址:')
        if per_name.strip() == '':
            print('联系人名称不能为空!')
            # continue跳出本次循环 ,break跳出整个循环
            continue
        else:
            per_dict.update({'姓名': per_name,
                             '手机号': per_phone,
                             '电子邮箱': per_email,
                             '联系地址': per_address})
            # 字典存入到列表中
            persion_info.append(per_dict)
            print('保存成功!')
    elif fun_num in ['2', '3', '4', '5']:
        if len(persion_info) != 0:
            if fun_num == '2':
                for i in persion_info:
                    for title, info in i.items():
                        print(title + ':' + info)
            elif fun_num == '3':
                del_name = input('请输入要删除的联系人姓名:')
                for i in persion_info:
                    if del_name in i.values():
                        persion_info.remove(i)
                        print(persion_info)
                        print('删除成功!')
                    else:
                        print('该联系人不在通讯录中!')
            elif fun_num == '4':
                modi_info = input('请输入要修改联系人的姓名:')
                for i in persion_info:
                    if modi_info in i.values():
                        # 获取所在的位置索引
                        index_num = persion_info.index(i)
                        dict_cur_perinfo = persion_info[index_num]
                        for title, info in dict_cur_perinfo.items():
                            print(title + ':' + info)
                            modi_name = input('请输入新的姓名:')
                            modi_phone = input('请输入新的手机号:')
                            modi_email = input('请输入新的邮箱:')
                            modi_address = input('请输入新的地址:')
                            dict_cur_perinfo.update(姓名=modi_name)
                            dict_cur_perinfo.update(手机号=modi_phone)
                            dict_cur_perinfo.update(电子邮箱=modi_email)
                            dict_cur_perinfo.update(联系地址=modi_address)
                            print(persion_info)
            elif fun_num == '5':  # 查找联系人
                query_name = input('请输入要查找的联系人姓名:')
                for i in persion_info:
                    if query_name in i.values():
                        index_num = persion_info.index(i)
                for title, info in persion_info[index_num].items():
                    print(title + ":" + info)
        else:
            print('通讯录是空的!请输入一些联系人信息!')
            continue
    elif fun_num == '6':
        print('谢谢使用!')
        break
  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2023-05-10 01:12
    关注

    因为在Python中,字典是可变对象,它们是通过引用传递的,而不是通过值传递的。
    因此,如果两个变量引用同一个字典对象,那么对其中一个变量所做的修改会影响另一个变量所引用的同一个字典对象。
    如果原始列表不想被修改,可以使用深拷贝方式copy.deepcopy()。

    import copy
    persion_info = []
    # 展示通讯录的功能
    print('=' * 20)
    print('欢迎使用通讯录')
    print('1.添加联系人')
    print('2.查看通讯录')
    print('3.删除联系人')
    print('4.修改联系人')
    print('5.查找联系人')
    print('6.退出')
    print('=' * 20)
    # 设计一个循环来输入、修改、查询等通信人的信息
    while True:
        # 虽然使用列表存储信息,但是每条信息都是字典
        # 在列表里存储字典
        per_dict = {}
        # 定义一个变量来接受需要的功能序号
        fun_num = input('请输入功能序号:')
        if fun_num == '1':
            per_name = input('请输入联系人姓名:')
            per_phone = input('请输入联系人的手机号码:')
            per_email = input('请输入联系人的邮箱:')
            per_address = input('请输入联系人的地址:')
            if per_name.strip() == '':
                print('联系人名称不能为空!')
                # continue跳出本次循环 ,break跳出整个循环
                continue
            else:
                per_dict.update({'姓名': per_name,
                                 '手机号': per_phone,
                                 '电子邮箱': per_email,
                                 '联系地址': per_address})
                # 字典存入到列表中
                persion_info.append(per_dict)
                print('保存成功!')
        elif fun_num in ['2', '3', '4', '5']:
            if len(persion_info) != 0:
                if fun_num == '2':
                    for i in persion_info:
                        for title, info in i.items():
                            print(title + ':' + info)
                elif fun_num == '3':
                    del_name = input('请输入要删除的联系人姓名:')
                    for i in persion_info:
                        if del_name in i.values():
                            persion_info.remove(i)
                            print(persion_info)
                            print('删除成功!')
                        else:
                            print('该联系人不在通讯录中!')
                elif fun_num == '4':
                    modi_info = input('请输入要修改联系人的姓名:')
                    for i in persion_info:
                        if modi_info in i.values():
                            # 获取所在的位置索引
                            index_num = persion_info.index(i)
                            dict_cur_perinfo = copy.deepcopy(persion_info[index_num])
                            for title, info in dict_cur_perinfo.items():
                                print(title + ':' + info)
                                modi_name = input('请输入新的姓名:')
                                modi_phone = input('请输入新的手机号:')
                                modi_email = input('请输入新的邮箱:')
                                modi_address = input('请输入新的地址:')
                                dict_cur_perinfo.update(姓名=modi_name)
                                dict_cur_perinfo.update(手机号=modi_phone)
                                dict_cur_perinfo.update(电子邮箱=modi_email)
                                dict_cur_perinfo.update(联系地址=modi_address)
                                print(persion_info)
                elif fun_num == '5':  # 查找联系人
                    query_name = input('请输入要查找的联系人姓名:')
                    for i in persion_info:
                        if query_name in i.values():
                            index_num = persion_info.index(i)
                    for title, info in persion_info[index_num].items():
                        print(title + ":" + info)
            else:
                print('通讯录是空的!请输入一些联系人信息!')
                continue
        elif fun_num == '6':
            print('谢谢使用!')
            break
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月20日
  • 已采纳回答 9月12日
  • 创建了问题 5月9日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上