清湛水 2022-01-27 11:11 采纳率: 100%
浏览 95
已结题

python列表嵌套字典选择性修改键值变成全部修改

学习python入门到实践这本书第六章
aliens = [] 
new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}  #new_alien在嵌套前定义
for alien_number in range (0,30):    
     aliens.append(new_alien)
for alien in aliens[0:8]: #选择列表aliens0-7的字典
     if alien['color'] == 'green': #修改键值
         alien['color'] = 'yellow' 
         alien['speed'] = 'medium' 
         alien['points'] = 10 
for alien in aliens[0:12]: #选择列表aliens0-11字典
 print(alien) 


运行如下
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
Press any key to continue . . .#并没有达到选择性修改列表字典键值,并且输出aliens全部字典时发现键值全部被修改

aliens = [] 
for alien_number in range (0,30):    
     new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'} #new_alien在嵌套内定义
     aliens.append(new_alien)
for alien in aliens[0:8]: #选择列表aliens0-7的字典
     if alien['color'] == 'green': #修改键值
         alien['color'] = 'yellow' 
         alien['speed'] = 'medium' 
         alien['points'] = 10 
for alien in aliens[0:12]: #选择列表aliens0-11字典
 print(alien) 

运行如下{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
Press any key to continue . . .#到达目的,aliens列表选择性字典键值被修改

于是有了疑惑,为什么new_alien在嵌套时位于for循环内外会有这么大差距

  • 写回答

3条回答 默认 最新

  • 关注

    字典是按地址传递的,当把同一个字典多次添加到列表中时,列表中每个字典都是同一个地址。
    改变其中一个字典的属性,列表中所有字典都会一起改变。
    new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'} 放在循环中是在循环中每次都创建一个新的字典,让列表中每个字典都是不同的地址。

    aliens = []
    new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}  #new_alien在嵌套前定义
    for alien_number in range (0,30):
        aliens.append(new_alien)
    for alien in aliens[0:8]: #选择列表aliens0-7的字典
        print("字典的地址都是同一个",id(alien))
        if alien['color'] == 'green': #修改键值
            alien['color'] = 'yellow'
            alien['speed'] = 'medium'
            alien['points'] = 10
    for alien in aliens[0:12]: #选择列表aliens0-11字典
        print(alien)
    

    img

    aliens = []
    for alien_number in range (0,30):
        new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}  #new_alien在嵌套前定义
        aliens.append(new_alien)
    for alien in aliens[0:8]: #选择列表aliens0-7的字典
        print("字典的地址不相同",id(alien))
        if alien['color'] == 'green': #修改键值
            alien['color'] = 'yellow'
            alien['speed'] = 'medium'
            alien['points'] = 10
    for alien in aliens[0:12]: #选择列表aliens0-11字典
        print(alien)
    

    img

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • 於黾 2022-01-27 11:15
    关注

    字典是可变值类型,对应于c和java里的引用类型
    如果你在嵌套前定义,那么一共只有一个字典,然后你把它的引用放到了list里的10个不同的位置,但是其实都指向同一个字典
    你改list里的任意一项,改的都是它自己

    评论 编辑记录
  • 有问必答小助手 2022-01-28 09:18
    关注
    您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
    PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月5日
  • 已采纳回答 1月28日
  • 创建了问题 1月27日

悬赏问题

  • ¥20 基于python进行多背包问题的多值编码
  • ¥15 相同型号电脑与配置,发现主板有一台貌似缺少了好多元器件似的,会影响稳定性和使用寿命吗?
  • ¥15 要求编写稀疏矩阵A的转置矩阵的算法
  • ¥15 编写满足以下要求的停车场管理程序,设停车场只有一个可停放n辆车的狭窄通道且只有一个大门可供车辆进出。
  • ¥15 C语言:数据子序列基础版
  • ¥20 powerbulider 导入excel文件,显示不完整
  • ¥15 用keil调试程序保证结果进行led相关闪烁
  • ¥15 paddle训练自己的数据loss降不下去
  • ¥20 用matlab的pdetool解决以下三个问题
  • ¥15 单个福来轮的平衡与侧向滑动是如何做到的?