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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题