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)
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)
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
字典是可变值类型,对应于c和java里的引用类型
如果你在嵌套前定义,那么一共只有一个字典,然后你把它的引用放到了list里的10个不同的位置,但是其实都指向同一个字典
你改list里的任意一项,改的都是它自己