2010-11-17 2 views
3

Я знаю, что «присваивание переменной» в python на самом деле является связующим/повторным связыванием имени (переменной) с объектом.Назначение в python

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

Я предполагаю, что нет никакой необходимости в том, что в Python:

  1. Inmutable объекты не могут быть «назначены», поскольку они не могут быть изменены

  2. изменяемые объекты потенциально могут быть назначены, поскольку они могут измениться, и это может быть полезно, так как вы можете манипулировать копией словаря отдельно от оригинала. Однако в этих случаях философия python предлагает метод клонирования на изменяемом объекте, поэтому вы можете привязать копию, а не оригинал.

Так что я думаю, ответ в том, что нет никакого присваивания в питоне, лучший способ имитировать это будет обязательным для клонированного объекта

Я просто хотел поделиться вопросом в случае, если я не хватает что-то важное здесь

Благодаря

EDIT:

и Ли Райан и Свен M arnach ответы хороши, я предполагаю, что общий ответ является сочетание обоих:

Для определенных пользователем типов, используйте идиома:

а. ДИКТ = ДИКТ (б. ДИКТ)

(я предполагаю, что это имеет проблемы, а если назначенный класс переопределяет методы доступа к атрибутам, но позволяет не быть суетливым :))

Для изменяемые встроенные модули (списки и dicts) используют для клонирования/копирования методов, которые они предоставляют (например, ломтики, обновлять)

наконец inmutable встроенные модули не могут быть изменены таким образом, не может быть назначен

Я выберу Li Райан, потому что это изящная идиома, о которой я не думал.

Спасибо!

+0

Вы спрашиваете о глубокой копии? Это то, что вы подразумеваете под «привязкой к клонированному объекту»? –

ответ

3

Это приносит вопрос: это возможно иметь надлежащее назначение в питона, например, сделать объект, равный другого объекта?

Да, вы можете:

a.__dict__ = dict(b.__dict__) 

будут делать задание по умолчанию семантического в C/C++ (т.е. сделать неглубокое задание).

Проблема с таким обобщенным назначением заключается в том, что он никогда не работает для всех. В C++ вы можете переопределить оператор присваивания, поскольку вам всегда нужно выбирать, хотите ли вы полностью мелкое задание, полностью глубокое присвоение или любой оттенок между полностью глубокой копией и полностью мелкой копией.

1

Я не думаю, что вам что-то не хватает.

Мне нравится изображать переменные в python как имя, написанное на «ярлыках», прикрепленное к ящикам, но могу изменить его размещение по назначению, тогда как на других языках назначение изменяет содержимое окна (и оператор присваивания может быть перегружен).

Начинающие могут писать довольно сложные приложения, не зная об этом, но они, как правило, грязные программы.

4

Я думаю, что вы правы с вашей характеристикой назначения в Python - я просто хотел бы добавить другой метод клонирования и способы назначения в особых случаях.

"Copy-конструкционный" а изменяемые встроенный объект Python даст (поверхностную) копию этого объекта:

l = [2, 3] 
m = list(l) 
l is m 
--> False 

[Edit: Как отметил Пол McGuire в комментариях , поведение «copy contructor» (простить мне терминологию на C++) для неизменяемый встроенный объект Python зависит от реализации: вы можете получить копию или только тот же объект. Но поскольку объект неизменен в любом случае, вам все равно.]

Конструктор копирования можно было бы назвать в общем случае y = type(x)(x), но это кажется немного загадочным. И, конечно же, есть модуль copy, который позволяет делать мелкие и глубокие копии.

Некоторые объекты Python позволяют назначать. Например, вы можете назначить список без создания нового объекта:

l = [2, 3] 
m = l 
l[:] = [3, 4, 5] 
m 
--> [3, 4, 5] 

Для словарей, вы можете использовать clear() метод с последующим update(otherdict) назначить словарь без создания нового объекта. Для набора s вы можете использовать

s.clear() 
s |= otherset 
+0

Ваши предположения «конструктор экземпляра» * могут иметь значение true для встроенных классов Python, но они обычно не гарантируются для всех классов и объектов. Я могу очень легко создать неизменяемый класс, который принимает экземпляр сам по себе для построения, но делает совершенно другой объект с одинаковыми значениями, так что 'copy == original' является True, но' copy is original' является False. – PaulMcG

+0

Я только заметил, что вы уже определили свой ответ, чтобы ограничить его встроенными классами. – PaulMcG

+0

Краткий эксперимент с Jython 2.5.0 показывает, что это не верно для строк. : >>> a = "SLJDFSDLJ" >>> b = str (a) >>> b - это False - то, что вы описали, является оптимизацией реализации, специфичной для CPython, но не гарантированной спецификацией языка Python. – PaulMcG

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