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循环内外会有这么大差距

字典是按地址传递的,当把同一个字典多次添加到列表中时,列表中每个字典都是同一个地址。
改变其中一个字典的属性,列表中所有字典都会一起改变。
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

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

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632