Когда переменные относятся к одному и тому же объекту, как это называется, и почему у python есть эта функция?

В python две разные переменные могут представлять один и тот же объект. Заметим:

>>> list1=['This is list1.'] >>> list2=list1 >>> list2[0] = 'This is actually list2 not list one.' >>> print list1 ['This is actually list2 not list one.'] 

Вот ссылка на этот код. Как вы можете видеть, нет списка1 или list2, только один список с двумя именами. Мне хорошо известно об этом эффекте, и я помню из книги, что это намеренно, но я забываю, что такое явление. Кроме того, это случайный источник ошибок, и другие языки не имеют этой проблемы. У меня есть ощущение, что некоторые вещи, связанные с объектами, сломаются, но без него. Каковы конкретные преимущества этого (поскольку python – это все, что я действительно знаю).

Обычно это называется наличием нескольких ссылок на один объект. Количество ссылок называется refcount .

В случае рекурсивных структур данных (деревья, связанные списки) его также можно назвать совместным использованием структуры.

Каковы конкретные преимущества этого

Чтобы вам не нужно копировать значение, чтобы передать его функции. Скажем, у вас есть функция

 def print_list(l): print("I see %d elements:" % len(l)) for x in l: print(x) 

Когда вы передаете список этой функции, то, что фактически передается, является ссылкой только на список, а не на копию содержимого списка. Аналогично, такие методы, как append , extend , sort и т. Д., Трудно реализовать без этой функции; им приходилось постоянно создавать и возвращать новые списки. То же самое касается любой функции или метода, который изменяет структуру данных на месте.

Когда вы выполняете многопоточное программирование, совместное использование структур данных на самом деле является общим способом настройки связи: несколько потоков будут ссылаться на общую Queue которую они используют для передачи сообщений.

на других языках эта проблема отсутствует

На всех языках, кроме чисто функциональных, это может быть проблемой. В C, C ++, Go и Pascal это может происходить с указателями, в Prolog с непреднамеренной унификацией, а в Java он работает так же, как и в Python.