Уведомления

Группа в Telegram: @pythonsu

#1 Март 22, 2008 12:56:40

$m1t
От:
Зарегистрирован: 2006-12-31
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про копирование объектов

Почему следующий код ведет себя так, как он ведет?

In [7]: d = {}
In [29]: for i in range(3):
   ....:     L[0] = 0
   ....:     L[1] = i
   ....:     print L
   ....:     d[i] = [L,L]
   ....:
[0, 0]
[0, 1]
[0, 2]
In [30]: d
Out[30]: {0: [[0, 2], [0, 2]], 1: [[0, 2], [0, 2]], 2: [[0, 2], [0, 2]]}
мне кажется удивительным то, что в d оказывается всюду конечное значение L.

Проблема решилась использованием модуля copy, однако дефолтовое поведение питона остается не понятным. Как сформулировать запрос гуглу - я что то не могу придумать.
p.s. python 2.5.1 если что.



Офлайн

#2 Март 22, 2008 13:00:20

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про копирование объектов

что-то я не понял форматирование кода %)



Офлайн

#3 Март 22, 2008 13:09:49

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про копирование объектов

L - это как-бы не сам объект, а ссылка на объект. Ты в цикле меняешь один и тот же объект, и в результате соответственно получается очевидный для питонера результат. Это фишка языков с динамической типизацией, коим питон и является.

В гугле советую поискать на тему “счётчика ссылок на объект в питоне”: google:python счётчик ссылок



Офлайн

#4 Март 22, 2008 13:58:35

$m1t
От:
Зарегистрирован: 2006-12-31
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про копирование объектов

shiza
это копипаст из ipython - я использую этот shell. раньше использовал pycrust но pycrust по ходу дела сейчас не поддерживается.
poltergeist
Спасибо, прочитал первую же статью, кажется разобрался, однако есть в питоне оказывается и не красивые места.

In [13]: a = [1,2,3,4]
In [14]: b = a
In [15]: b
Out[15]: [1, 2, 3, 4]
In [16]: a += [5]
In [17]: a
Out[17]: [1, 2, 3, 4, 5]
In [18]: b
Out[18]: [1, 2, 3, 4, 5]
In [19]: a = a + [6]
In [20]: a
Out[20]: [1, 2, 3, 4, 5, 6]
In [21]: b
Out[21]: [1, 2, 3, 4, 5]



Отредактировано (Март 22, 2008 13:59:18)

Офлайн

#5 Март 22, 2008 14:47:15

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про копирование объектов

$m1t я как-то недавно спорил с одним человеком, мне пришлось доказывать что в питоне всё правильно и красиво, и пришлось признать, что есть в питоне противоречивые вещи, разные нюансы, о которых новички не знают и их интуитивно не всегда угадаешь, разве что в доке читать или экспериментировать в интерактиве.

Вот статьи в тему:
http://www.ibm.com/developerworks/library/l-python-elegance-1.html
http://www.ibm.com/developerworks/library/l-python-elegance-2.html



Офлайн

#6 Март 22, 2008 16:52:03

$m1t
От:
Зарегистрирован: 2006-12-31
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про копирование объектов

poltergeist
благодарю, хорошие статьи.
p.s. Надеюсь, что в python 3000 все это безобразие поправят. Кто нибудь уже пытался с ним работать?



Отредактировано (Март 22, 2008 16:56:56)

Офлайн

#7 Март 22, 2008 17:18:01

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вопрос про копирование объектов

Не поправят, не надейтесь.
Поиграться с Py3k сейчас уже вплолне можно. Делать что-то всерьез рановато



Офлайн

#8 Март 23, 2008 22:45:57

umup
От:
Зарегистрирован: 2007-07-14
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про копирование объектов

еще нужно исключить tuples или изменить их синтаксис (круглые скобки), очень много с ними неоднозначностей, ну и значения/ссылки тоже…



Отредактировано (Март 23, 2008 22:47:26)

Офлайн

#9 Март 24, 2008 08:09:17

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про копирование объектов

Не, больше всего старых программеров достают отступы:)



Офлайн

#10 Март 24, 2008 12:22:51

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Вопрос про копирование объектов

Да - отступы одновременно и замечательная штука, и источник ошибок, особенно если разработкой занимаются несколько человек. Конечно, всегда соблюдая пеп8, такая проблема возникать не должна, но сколько уже раз бывало, что

class A(object):
def do_something(self):
pass

def do_one_more_time(self):
pass

превращалось в

class A(object):
def do_something(self):
pass

def do_one_more_time(self):
pass



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version