python for循环作用域问题

想实现更改aliens列表前面两个字典子元素的值,如下代码会导致所有字典子元素的值都改变。请问是为什么?aliens=[]alien={'speed':'slow','c... 想实现更改aliens列表前面两个字典子元素的值,如下代码会导致所有字典子元素的值都改变。请问是为什么?
aliens = []
alien = {'speed':'slow','color':'green','points':5}
for aliens_number in range(20):
aliens.append(alien)

for x in aliens[0:2]:
if x['color'] == 'green':
x['speed'] = 'medium'
x['color'] = 'yellow'
x['points'] = 15

print aliens
aliens = []

for aliens_number in range(20):
alien = {'speed':'slow','color':'green','points':5} aliens.append(alien) #放到这里就会成功实现
for x in aliens[0:2]:
if x['color'] == 'green':
x['speed'] = 'medium'
x['color'] = 'yellow'
x['points'] = 15

print aliens
展开
 我来答
872229956
2018-11-13
知道答主
回答量:39
采纳率:66%
帮助的人:11.4万
展开全部
你append(alien),意味着,你的aliens 里面装了20个 alien,并且这20个alien都是内存地址是一样的,也就是20个人共用一桶水,其中一个人把里面的水换成了啤酒,大家喝的只能是啤酒.
解决办法:
for aliens_number in range(20):
a=alien.copy()
aliens.append(a)
藤原子大雄
2018-11-13 · TA获得超过7197个赞
知道大有可为答主
回答量:6977
采纳率:82%
帮助的人:1765万
展开全部
  递归是另一种取代循环的方法。递归其实是函数式编程很常见的形式,经常可以在一些算法中见到。但之所以放到最后,是因为实际上我们一般很少用到递归。如果一个递归无法被编译器或解释器优化,很容易就会产生栈溢出;另一方面复杂的递归往往让人感觉迷惑,不如循环清晰,所以众多最佳实践均指出使用循环而非递归。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式