Форум сайта python.su
Почему следующий код ведет себя так, как он ведет?
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]]}
Офлайн
что-то я не понял форматирование кода %)
Офлайн
L - это как-бы не сам объект, а ссылка на объект. Ты в цикле меняешь один и тот же объект, и в результате соответственно получается очевидный для питонера результат. Это фишка языков с динамической типизацией, коим питон и является.
В гугле советую поискать на тему “счётчика ссылок на объект в питоне”: google:python счётчик ссылок
Офлайн
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)
Офлайн
$m1t я как-то недавно спорил с одним человеком, мне пришлось доказывать что в питоне всё правильно и красиво, и пришлось признать, что есть в питоне противоречивые вещи, разные нюансы, о которых новички не знают и их интуитивно не всегда угадаешь, разве что в доке читать или экспериментировать в интерактиве.
Вот статьи в тему:
http://www.ibm.com/developerworks/library/l-python-elegance-1.html
http://www.ibm.com/developerworks/library/l-python-elegance-2.html
Офлайн
poltergeist
благодарю, хорошие статьи.
p.s. Надеюсь, что в python 3000 все это безобразие поправят. Кто нибудь уже пытался с ним работать?
Отредактировано (Март 22, 2008 16:56:56)
Офлайн
Не поправят, не надейтесь.
Поиграться с Py3k сейчас уже вплолне можно. Делать что-то всерьез рановато
Офлайн
еще нужно исключить tuples или изменить их синтаксис (круглые скобки), очень много с ними неоднозначностей, ну и значения/ссылки тоже…
Отредактировано (Март 23, 2008 22:47:26)
Офлайн
Не, больше всего старых программеров достают отступы:)
Офлайн
Да - отступы одновременно и замечательная штука, и источник ошибок, особенно если разработкой занимаются несколько человек. Конечно, всегда соблюдая пеп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
Офлайн