RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 999572
Accepted
Андрей Крузлик
Андрей Крузлик
Asked:2020-07-05 12:33:24 +0000 UTC2020-07-05 12:33:24 +0000 UTC 2020-07-05 12:33:24 +0000 UTC

字典列表被覆盖

  • 772
mob = [
    {"last_name": "Petrov", "first_name": "Oleg", "phone": "46546546465", "age": "4"},
    {"last_name": "Ivanov", "first_name": "Petr", "phone": "34534534534", "age": "5"},
    {"last_name": "Metrov", "first_name": "Mikl", "phone": "56456456466", "age": "6"},
    {"last_name": "HHHHHH", "first_name": "Manr", "phone": "77777777777", "age": "7"},
    {"last_name": "PPPPPP", "first_name": "Give", "phone": "64563426888", "age": "8"},
    {"last_name": "TTTTTT", "first_name": "Lisa", "phone": "66666666666", "age": "9"}
]
peple = {}
peples = []

for i in mob:
    peple["last_name"] = i['last_name']
    peple["phones"] = ['phones']
    peple["age"] = i['age']

    peples.append(peple)


print(peples)

为什么整个列表都peples[]填满了列表中的最后一个值mob[]?

python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Alexshev92
    2020-07-05T12:43:10Z2020-07-05T12:43:10Z

    变量peple是对内存中对象的引用。那些。列表内部peples存储了对同一对象的引用。因此,在每次迭代时调用

    peple["last_name"] = i['last_name']
    peple["phones"] = ['phones']
    peple["age"] = i['age']
    

    通过改变字典的值peple,我们也在改变已经添加到数组中的值peples。为了解决这个问题,你可以在循环中声明一个字典:

    for i in mob:
        peple = {}
        peple["last_name"] = i['last_name']
        peple["phones"] = ['phones']
        peple["age"] = i['age']
    
        peples.append(peple)
    

    id您可以使用返回对象标识符的函数检查数组是否存储了对同一对象的引用。对于您提供的代码:

    peples = []
    peple = {}
    for i in mob:
        peple["last_name"] = i['last_name']
        peple["phones"] = ['phones']
        peple["age"] = i['age']
    
        peples.append(peple)
        print(id(peple))
    

    结论:

    47920208
    47920208
    47920208
    47920208
    47920208
    47920208
    

    peple如果我们在循环中定义字典:

    peples = []
    
    for i in mob:
        peple = {}
        peple["last_name"] = i['last_name']
        peple["phones"] = ['phones']
        peple["age"] = i['age']
    
        peples.append(peple)
        print(id(peple))
    

    结论:

    47985792
    48167744
    48167792
    48167840
    48167888
    48167936
    

    可以看出,第一种情况下所有对象的标识符都是相同的,第二种情况则不同。

    • 3
  2. Pavel Durmanov
    2020-07-05T14:31:27Z2020-07-05T14:31:27Z
    In [23]: import operator
    
    In [24]: keys = "last_name", "phone", "age"
    
    In [25]: items = operator.itemgetter(*keys)
    
    In [26]: mob = [
        ...:     {"last_name": "Petrov", "first_name": "Oleg", "phone": "46546546465", "age": "4"},
        ...:     {"last_name": "Ivanov", "first_name": "Petr", "phone": "34534534534", "age": "5"},
        ...:     {"last_name": "Metrov", "first_name": "Mikl", "phone": "56456456466", "age": "6"},
        ...:     {"last_name": "HHHHHH", "first_name": "Manr", "phone": "77777777777", "age": "7"},
        ...:     {"last_name": "PPPPPP", "first_name": "Give", "phone": "64563426888", "age": "8"},
        ...:     {"last_name": "TTTTTT", "first_name": "Lisa", "phone": "66666666666", "age": "9"}
        ...: ]
    
    In [27]: [dict(zip(keys, items(item))) for item in mob]
    Out[27]:
    [{'last_name': 'Petrov', 'phone': '46546546465', 'age': '4'},
     {'last_name': 'Ivanov', 'phone': '34534534534', 'age': '5'},
     {'last_name': 'Metrov', 'phone': '56456456466', 'age': '6'},
     {'last_name': 'HHHHHH', 'phone': '77777777777', 'age': '7'},
     {'last_name': 'PPPPPP', 'phone': '64563426888', 'age': '8'},
     {'last_name': 'TTTTTT', 'phone': '66666666666', 'age': '9'}]
    

    这是一篇关于类型可变性的好文章https://medium.com/@Cu7ious/python-mutable-vs-immutable-ae9a188effe3。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5