Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюк со словарями внутри списков 
:(
    Опции темы
erty
Дата 11.9.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.5.2007

Репутация: нет
Всего: нет



голову сломал пока пытался обнаружить ошибку, наконец столкнулся с такой занятной штукой:
хочу использовать словари внутри списков

Код

x = [{'a':'', 'b':'', 'c':'', 'd':''},{'a':'', 'b':'', 'c':'', 'd':''}]
x[1]['a'] = 10
print x
print type(x), type(x[1])

Получаем:
Код

[{'a': '', 'c': '', 'b': '', 'd': ''}, {'a': 10, 'c': '', 'b': '', 'd': ''}]
<type 'list'> <type 'dict'>

все ок, все как и должно быть.

Но т.к. я не знаю сколько у меня будет элементов в списке, я создаю у себя цикл, смысл которого сводится к:
Код

y = {'a':'', 'b':'', 'c':'', 'd':''}
list = [y]
list.append(y)
print list
list[1]['a'] = 10
print list
print type(list), type(list[1])

Получаем:
Код

[{'a': '', 'c': '', 'b': '', 'd': ''}, {'a': '', 'c': '', 'b': '', 'd': ''}]

[{'a': 10, 'c': '', 'b': '', 'd': ''}, {'a': 10, 'c': '', 'b': '', 'd': ''}]
<type 'list'> <type 'dict'>


Вот как можно объяснить, что у меня и list[0]['a'] и list[1]['a'] изменились на 10? хотя должен был изменится только list[1]['a']!
 smile 

Python: 2.5.1 Win32

Это сообщение отредактировал(а) erty - 11.9.2007, 15:17
PM   Вверх
yar
Дата 11.9.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

Репутация: нет
Всего: 8



Похоже, что y - это ссылка. Поэтому, если нужно скопировать словарь, надо использовать copy().
Вот код:

Код
y = {'a':'', 'b':'', 'c':'', 'd':''}
list = [y]
list.append(y.copy())
print list
list[1]['a']=10
print list
print type(list), type(list[1])


Вывод:

Код

[{'a': '', 'c': '', 'b': '', 'd': ''}, {'a': '', 'c': '', 'b': '', 'd': ''}]
[{'a': '', 'c': '', 'b': '', 'd': ''}, {'a': 10, 'c': '', 'b': '', 'd': ''}]
<type 'list'> <type 'dict'>

--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
erty
Дата 11.9.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.5.2007

Репутация: нет
Всего: нет



Спасибо! не перестаю удивляться чудесам питона  smile 

Это сообщение отредактировал(а) erty - 11.9.2007, 15:30
PM   Вверх
verstalishik
Дата 11.9.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.9.2007

Репутация: нет
Всего: нет



потому что у тебя в list[0] и list[1] храниться ссылка на один объект smile
PM MAIL   Вверх
pythonwin
Дата 12.9.2007, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(yar @  11.9.2007,  18:23 Найти цитируемый пост)
Похоже, что y - это ссылка. Поэтому, если нужно скопировать словарь, надо использовать copy().

можно создать новый словарь и вот 
так:
Код

d = {'1':1, '2':2}
d1 = dict(**d)

PM WWW GTalk Jabber   Вверх
Daevaorn
Дата 12.9.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



pythonwin, звездочки не обязательны
PM MAIL WWW   Вверх
pythonwin
Дата 12.9.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(Daevaorn @  12.9.2007,  18:24 Найти цитируемый пост)
pythonwin, звездочки не обязательны 

спасибо что сказал - а то забыл написать и этот пример:
Код

>>> d={'1':1, '2':2, '3':3}
>>> d1=dict(d)
>>> d
{'1': 1, '3': 3, '2': 2}
>>> d['4']=4
>>> d1
{'1': 1, '3': 3, '2': 2}
>>> d1.update({5:5})
>>> d
{'1': 1, '3': 3, '2': 2, '4': 4}
>>> d1
{'1': 1, '3': 3, '2': 2, 5: 5}
>>>

PM WWW GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.