2013-05-25 1 views
3

В 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.'] 

Here is a link to this code. Как вы можете видеть, нет песни1 или песни2, только один список с двумя именами. Мне хорошо известно об этом эффекте, и я помню из книги, что это намеренно, но я забываю, что такое явление. Кроме того, это случайный источник ошибок, и другие языки не имеют этой проблемы. У меня есть ощущение, что некоторые вещи, связанные с объектами, сломаются, но без него. Каковы конкретные преимущества этого (поскольку python - это все, что я действительно знаю.)

+7

[Потенциально полезный] (http://pythontutor.com/visualize.html#code=list1+%3D+%5B'This+is+list1.'%5D%0Alist2+%3D+list1%0Alist2%5B0%5D+% 3D + 'Этот + есть + фактически + list2 + not + list + one.'% 0Aprint + list1 & mode = display & cumulative = false & heapPrimitives = false & drawParentPointers = false & textReferences = false & showOnlyOutputs = false & py = 2 & curInstr = 0) – Eric

+1

Как функционируют аргументы, если это не было дело? –

+0

Да, может быть, моя книга была неправильной. – PyRulez

ответ

5

Обычно это называется наличием нескольких ссылок на один объект. Количество ссылок называется 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.

+0

Отслеживание пересчета - это то, как сбор мусора (восстановление памяти) работает на некоторых языках. –

+0

Таким образом, это сохраняет память. Хорошо. Имеются ли какие-либо преимущества в отношении того, как взаимодействуют пользовательские объекты? – PyRulez

+0

@PyRulez: в основном это касается экономии места, но вы можете использовать это поведение в некоторых классах/структурах данных. Например. список объектов «Player» может совместно использовать один «Совет», который затем можно использовать в качестве устройства связи. Не пытайтесь быть слишком умным в этом, хотя, поскольку это действительно потенциальный источник ошибок. –

Смежные вопросы