By value/by reference
От: Roman Odaisky Украина  
Дата: 03.04.13 10:08
Оценка: 21 (1)
Большинство современных языков, которые не называются C++, по умолчанию передают параметры по ссылке, и даже простое присваивание создает новую ссылку на объект, а не копию. Я было думал, что хорошо знаком с этими тонкостями, но всё же наткнулся на вот такие грабли:

#!python

schedule_by_day = [[]] * 7 # а ведь совсем не то же самое, что [[] for _ in range(7)]
for ...:
    schedule_by_day[d].append(...)

Хотел создать список из семи пустых списков, а получил список из семи ссылок на один и тот же список.

Обычно стремлюсь писать в ФП-подобном иммутабельном стиле, тогда такого обычно не случается (и то не гарантия, см. известный баг: [f() for f in [(lambda: i) for i in range(10)]]), но в этой задаче императивный подход был намного естественее — и, как оказалось, опаснее.

А как в вашем любимом языке отличается передача по ссылке от передачи по значению, как это позволяет избежать подобных проблем и какие новые проблемы создает?
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.