Найти - Пользователи
Полная версия: Вопрос про копирование объектов
Начало » Python для экспертов » Вопрос про копирование объектов
1 2
$m1t
Почему следующий код ведет себя так, как он ведет?
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 если что.
shiza
что-то я не понял форматирование кода %)
poltergeist
L - это как-бы не сам объект, а ссылка на объект. Ты в цикле меняешь один и тот же объект, и в результате соответственно получается очевидный для питонера результат. Это фишка языков с динамической типизацией, коим питон и является.

В гугле советую поискать на тему “счётчика ссылок на объект в питоне”: google:python счётчик ссылок
$m1t
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]
poltergeist
$m1t я как-то недавно спорил с одним человеком, мне пришлось доказывать что в питоне всё правильно и красиво, и пришлось признать, что есть в питоне противоречивые вещи, разные нюансы, о которых новички не знают и их интуитивно не всегда угадаешь, разве что в доке читать или экспериментировать в интерактиве.

Вот статьи в тему:
http://www.ibm.com/developerworks/library/l-python-elegance-1.html
http://www.ibm.com/developerworks/library/l-python-elegance-2.html
$m1t
poltergeist
благодарю, хорошие статьи.
p.s. Надеюсь, что в python 3000 все это безобразие поправят. Кто нибудь уже пытался с ним работать?
Андрей Светлов
Не поправят, не надейтесь.
Поиграться с Py3k сейчас уже вплолне можно. Делать что-то всерьез рановато
umup
еще нужно исключить tuples или изменить их синтаксис (круглые скобки), очень много с ними неоднозначностей, ну и значения/ссылки тоже…
poltergeist
Не, больше всего старых программеров достают отступы:)
ZAN
Да - отступы одновременно и замечательная штука, и источник ошибок, особенно если разработкой занимаются несколько человек. Конечно, всегда соблюдая пеп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
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