Уведомления

Группа в Telegram: @pythonsu

#1 Июль 5, 2012 10:02:40

soln
От:
Зарегистрирован: 2011-11-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

Приветствую.
Собственно вот:

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

Чем объясняется такое поведение?



Отредактировано soln (Июль 5, 2012 10:16:17)

Офлайн

#2 Июль 5, 2012 10:38:31

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2267
Репутация: +  41  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

так в данном случае и создаёт лишь 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 будет новый для каждого ключа

Отредактировано slav0nic (Июль 5, 2012 10:44:56)

Офлайн

#3 Июль 5, 2012 11:25:32

soln
От:
Зарегистрирован: 2011-11-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

Спасибо за ответ.
Интересная конструкция

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 у Вас?



Отредактировано soln (Июль 5, 2012 11:27:51)

Офлайн

#4 Июль 5, 2012 11:32:08

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

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': []}
>>> 



Офлайн

#5 Июль 5, 2012 13:35:43

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2267
Репутация: +  41  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

soln
PEP274 был реализован в py2.7 и 3к, судя по твоей ошибке у тебя питон таки 2.6 ;)

Офлайн

#6 Июль 5, 2012 13:46:36

soln
От:
Зарегистрирован: 2011-11-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

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': []}



Отредактировано soln (Июль 5, 2012 13:54:22)

Офлайн

#7 Июль 5, 2012 13:57:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

soln
похоже что 2.6 так не умеет
А это ни для кого не секрет. Зачем ты вводишь людей в заблуждение?
soln
Только вот у меня это не работает (python 2.7)



Офлайн

#8 Июль 5, 2012 14:38:20

soln
От:
Зарегистрирован: 2011-11-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

FishHook
soln
похоже что 2.6 так не умеет
А это ни для кого не секрет. Зачем ты вводишь людей в заблуждение?

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

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

Спасибо за ответы.



Отредактировано soln (Июль 5, 2012 14:43:25)

Офлайн

#9 Июль 5, 2012 15:24:08

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2267
Репутация: +  41  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

soln
я бы не забивал голову ерундой в поисках изящности (на начальных этапах особенно), нормальная такая “конструкция”
для первого случая можно ещё аля (под 2.6)

>>> dict((k, []) for k in ('right', 'left'))
{'right': [], 'left': []}
>>>


Отредактировано slav0nic (Июль 5, 2012 15:31:46)

Офлайн

#10 Июль 5, 2012 15:27:57

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

dict.fromkeys возвращает ссылки на один и тот же объект???

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=[])]
>>>

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version