Найти - Пользователи
Полная версия: dict.fromkeys возвращает ссылки на один и тот же объект???
Начало » Python для новичков » dict.fromkeys возвращает ссылки на один и тот же объект???
1 2
soln
Приветствую.
Собственно вот:

In [40]: twogrid = []
In [41]: for x in xrange(2): twogrid.append(dict.fromkeys(['left','right'], []))
In [42]: id(twogrid[0]['left'])
Out[42]: 34369616
In [43]: id(twogrid[0]['right'])
Out[43]: 34369616

соответственно:
In [44]: twogrid[0]['right'].append('x')
In [45]: twogrid[0]
Out[45]: {'left': ['x'], 'right': ['x']}

Чем объясняется такое поведение?
slav0nic
так в данном случае и создаёт лишь 1 раз, посему и ссылка на список везде одна
In [12]: d = {k: [] for k in ('left', 'right')}
In [13]: d
Out[13]: {'left': [], 'right': []}
In [14]: d['left'].append(1)
In [15]: d
Out[15]: {'left': [1], 'right': []
^ так list будет новый для каждого ключа
soln
Спасибо за ответ.
Интересная конструкция
slav0nic
d = {k: [] for k in ('left', 'right')}
Надо осознать.
Только вот у меня это не работает (python 2.7)
In [7]: d = {k: [] for k in ('left', 'right')}
------------------------------------------------------------
   File "<ipython console>", line 1
     d = {k: [] for k in ('left', 'right')}
                  ^
SyntaxError: invalid syntax

а какая версии python у Вас?
FishHook
soln
Только вот у меня это не работает (python 2.7)
Что-то у Вас явно не то

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {k: [] for k in ('left', 'right')}
>>> print d
{'right': [], 'left': []}
>>> 
slav0nic
soln
PEP274 был реализован в py2.7 и 3к, судя по твоей ошибке у тебя питон таки 2.6 ;)
soln
UPD
Ваш предыдущий ответ заметил лишь после как написал ответ
_______________________________-
Я Вас обманул, Извиняюсь.

Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.version_info
(2, 6, 5, 'final', 0)
>>> d = {k: [] for k in ('left', 'right')}
  File "<stdin>", line 1
    d = {k: [] for k in ('left', 'right')}
                 ^
SyntaxError: invalid syntax

FishHook
soln
Только вот у меня это не работает (python 2.7)
Что-то у Вас явно не то

похоже что 2.6 так не умеет

Python 3.1.2 (r312:79147, Dec  9 2011, 20:47:34) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.version_info)
sys.version_info(major=3, minor=1, micro=2, releaselevel='final', serial=0)
>>> d = {k: [] for k in ('left', 'right')}
>>> d
{'right': [], 'left': []}
FishHook
soln
похоже что 2.6 так не умеет
А это ни для кого не секрет. Зачем ты вводишь людей в заблуждение?
soln
Только вот у меня это не работает (python 2.7)
soln
FishHook
soln
похоже что 2.6 так не умеет
А это ни для кого не секрет. Зачем ты вводишь людей в заблуждение?

Да я как то не специально. Ошибся.

Хорошо а можно в 2.6 возвести ммм ну более изящную конструкцию чем
for x in xrange(26):
    twogrid.append({'left': [], 'right': []})

Спасибо за ответы.
slav0nic
soln
я бы не забивал голову ерундой в поисках изящности (на начальных этапах особенно), нормальная такая “конструкция”
для первого случая можно ещё аля (под 2.6)
>>> dict((k, []) for k in ('right', 'left'))
{'right': [], 'left': []}
>>>


EBFE
vlanmap = [{'left' : [], 'right' : []} for i in xrange(26)]
>>> from collections import namedtuple
>>> Tree = namedtuple('Tree','left right')
>>> vlanmap = [Tree([],[]) for i in xrange(6)]
>>> vlanmap[1].left.append(3)
>>> vlanmap
[Tree(left=[], right=[]), Tree(left=[3], right=[]), Tree(left=[], right=[]), Tre
e(left=[], right=[]), Tree(left=[], right=[]), Tree(left=[], right=[])]
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB