python 数组、序列和迭代融合的一个细节小问题
ringa_lee
ringa_lee 2017-04-17 12:05:56
[Python讨论组]
In [18]: dict = {'id':0}

In [19]: q = []

In [20]: for i in range(3):
   ....:     q.append(dict)
   ....:     q[i]['id'] = i
   ....:     print q
   ....:     
[{'id': 0}]
[{'id': 1}, {'id': 1}]
[{'id': 2}, {'id': 2}, {'id': 2}]

In [21]: print q
[{'id': 2}, {'id': 2}, {'id': 2}]

In [22]: 

我想的序列 q 最后应该是
[{'id': 0}, {'id': 1}, {'id': 2}]

为什么会得出[{'id': 2}, {'id': 2}, {'id': 2}]? 求解释啊


自己的欠缺啊,对象传参是对 对象的引用

In [5]: import copy

In [6]: dict = {'id' : 1}

In [7]: list = []

In [8]: for i in range(3):
   ...:     list.append(copy.deepcopy(dict))
   ...:     list[i]['id'] = i
   ...:     print list
   ...:     
[{'id': 0}]
[{'id': 0}, {'id': 1}]
[{'id': 0}, {'id': 1}, {'id': 2}]

采用深复制解决问题

ringa_lee
ringa_lee

ringa_lee

全部回复(2)
PHPz

因为 dictq 只是一个引用. 所以 q 中的所有元素, 都是一样的, 你改变其中一个, 所有的都改变了.

最简单的改法:

>>> q = []
>>> for i in range(3):
...     q.append({'id':0})
...     q[i]['id'] = i
...     print q
...
[{'id': 0}]
[{'id': 0}, {'id': 1}]
[{'id': 0}, {'id': 1}, {'id': 2}]
>>> q
[{'id': 0}, {'id': 1}, {'id': 2}]
天蓬老师
>>> map(lambda x: {'id': x}, range(3))
[{'id': 0}, {'id': 1}, {'id': 2}]
>>>

这个是你想要的吗?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号