Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 16, 2014 13:10:36

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Обход словаря с присвоением.

dic = dict.fromkeys(
    ['a', 'b', 'c'], dict.fromkeys(
        [1, 2, 3], dict.fromkeys(['x'])
    )
)
for i in ['a', 'b', 'c']:
    for j in [1, 2, 3]:
        dic[i][j]['x'] = (i, j)
dic возвращает мне:
{'a': {1: {'x': ('c', 3)}, 
       2: {'x': ('c', 3)}, 
       3: {'x': ('c', 3)}}, 
'c': {1: {'x': ('c', 3)}, 
      2: {'x': ('c', 3)}, 
      3: {'x': ('c', 3)}}, 
'b': {1: {'x': ('c', 3)},
      2: {'x': ('c', 3)}, 
      3: {'x': ('c', 3)}}
}

почему ‘x’ везде равен ('c', 3)?
как правильно переделать функцию, чтобы получить на выходе словарь вида
{'a': {1: {'x': ('a', 1)}, 
       2: {'x': ('a', 2)}, 
       3: {'x': ('a', 3)}}, 
...
}

Офлайн

#2 Апрель 16, 2014 21:44:26

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Обход словаря с присвоением.

dic = dict.fromkeys(
    ['a', 'b'], dict.fromkeys(
        [1, 2], dict.fromkeys(['x'])
    )
)
dc = {'a': {1: {'x': None}, 2: {'x': None}}, 'b': {1: {'x': None}, 2: {'x': None}}}
dc == dic
>>> True
dic['a'][1]['x'] = 1
dc['a'][1]['x'] = 1
dic == dc
>>> False
print dic
>>> {'a': {1: {'x': 1}, 2: {'x': 1}}, 'b': {1: {'x': 1}, 2: {'x': 1}}}
print dc
>>> {'a': {1: {'x': 1}, 2: {'x': None}}, 'b': {1: {'x': None}, 2: {'x': None}}}

Ребята, прокомментируйте пожалуйста этот кусок консольного кода.
я никак не пойму почему в одном случае все значения Х меняеются на 1, а в другом только для единственной позиции.

Офлайн

#3 Апрель 16, 2014 23:18:45

ATOM
Зарегистрирован: 2012-04-01
Сообщения: 8
Репутация: +  1  -
Профиль   Отправить e-mail  

Обход словаря с присвоением.

>>> dic = dict.fromkeys(['a', 'b'], dict.fromkeys([1, 2], dict.fromkeys(['x'])))
>>> dc = {'a': {1: {'x': None}, 2: {'x': None}}, 'b': {1: {'x': None}, 2: {'x': None}}}
>>> id(dic['a']), id(dic['b'])
(17691232, 17691232)
>>> id(dc['a']), id(dc['b'])
(17691112, 17663400)
>>> 



—————
Python 3

Офлайн

#4 Апрель 17, 2014 06:57:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Обход словаря с присвоением.

>>> import pprint
>>> pp = pprint.pprint
>>> 
>>> dic = {i: {j: {'x': (i, j)} for j in range(1, 4)} for i in 'abc'}
>>> 
>>> pp(dic, width=50)
{'a': {1: {'x': ('a', 1)},
       2: {'x': ('a', 2)},
       3: {'x': ('a', 3)}},
 'b': {1: {'x': ('b', 1)},
       2: {'x': ('b', 2)},
       3: {'x': ('b', 3)}},
 'c': {1: {'x': ('c', 1)},
       2: {'x': ('c', 2)},
       3: {'x': ('c', 3)}}}
>>>

botinag
почему ‘x’ везде равен ('c', 3)?

потому что словари ссылаются на один и тот же словарь
>>> print(dict.fromkeys.__doc__)
dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.
v defaults to None.
>>>

>>> d = dict.fromkeys('ab', {})
>>> d
{'b': {}, 'a': {}}
>>> d['a']['e'] = 1
>>> d
{'b': {'e': 1}, 'a': {'e': 1}}
>>>



Отредактировано py.user.next (Апрель 17, 2014 07:02:40)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version