首页 > python 数组、序列和迭代融合的一个细节小问题

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}]

采用深复制解决问题


因为 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}]
>>>

这个是你想要的吗?

【热门文章】
【热门文章】