Большинство современных языков, которые не называются 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)]]), но в этой задаче императивный подход был намного естественее — и, как оказалось, опаснее.
А как в вашем любимом языке отличается передача по ссылке от передачи по значению, как это позволяет избежать подобных проблем и какие новые проблемы создает?