2016-02-01 6 views
1

Я нашел проблему с «загадкой», когда я пытаюсь заполнить список в цикле «за».Python append in loop working mystery

Вот пример:

>>> params = [1,2,3,4,5] 
>>> el = {'param':0} 
>>> el 
{'param': 0} 
>>> list = [] 
>>> for param in params: 
...  el['param'] = param 
...  list.append(el) 
... 
>>> print(list) 
[{'param': 5}, {'param': 5}, {'param': 5}, {'param': 5}, {'param': 5}] 
>>> 

Но я думаю, что результат должен быть

>>> print(list) 
[{'param': 1}, {'param': 2}, {'param': 3}, {'param': 4}, {'param': 5}] 
>>> 

Как решить эту проблему? И почему реальный результат не похож на результат моего ума?

+0

Ваш результат верный. 'el' - это словарь, который все время обновляется по параметру value. Вы также сохраняете ** ссылку ** на этот словарь в списке, следовательно, результат –

+0

Читать [этот вопрос] (http://stackoverflow.com/questions/986006/how-do-i-pass-a- переменный по ссылке). – Zenadix

ответ

3

Каждый элемент в вашем списке содержит ссылку на то же самое dict. Вот почему вы видите одинаковое число в каждом элементе. Может быть, вы хотите сделать:

params = [1,2,3,4,5] 

a = [] 
for param in params: 
    el = {'param': param} 
    a.append(el) 

Кроме того, будьте осторожны с затенения встроенных команд, таких как list с вашими именами переменных.

+0

Спасибо! Но если у вас нет шансов создать новый el-объект на каждой итерации? Могу ли я сказать python, что я хочу, чтобы значение не ссылалось? – gostin

+0

№ Python работает только со ссылками. Если вы хотите скопировать значение, вы должны сделать это явно (либо создавая новый объект, либо используя метод 'copy') – spectras

1

Проблема в том, что вы используете один и тот же словарь для каждой записи в своем списке. Чтобы устранить эту проблему, добавьте el = {} выше el['param'] = param в свой цикл for.

2

el относится к тому же словарю повсюду, и list.append(el) добавляет ссылки в этот словарь, а не копия текущего значения, в список. У вас нет списка 5 различных словарей, но список из 5 ссылок на один словарь.

Чтобы узнать, что происходит более подробно, напечатайте list и el каждый раз через петлю. Вы увидите растущий список, который всегда относится к текущему значению el.

0

У вас есть один объект dict, который вы изменяете. Вы добавляете ссылку на этот файл в свой список несколько раз. Таким образом, ваш список содержит 5 ссылок на один и тот же объект dict.

1

Вы измените тот же dict на каждой итерации и добавьте его в list. Вы получите другой результат при добавлении копий этого dict в list.

Просто позвоните list.append(dict(el)).