2013-03-19 1 views
2

После создания комплексные числа Python доступны только для чтения.Как изменить комплексное число python

>>> x = complex(1,1) 
>>> x 
(1+1j) 
>>> x.real=2 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: readonly attribute 

Как изменить комплексное число в Python без создания нового комплекса? Это кажется ненужным ограничением. Любые идеи, почему комплекс был реализован следующим образом?

+0

в значительной степени по той же причине вы не можете сделать 'a = 4', а затем' a.real = 10'. – dmg

+0

@ DJV Нет, в вашем примере это также волшебным образом изменило бы тип, что еще хуже. – delnan

+3

@ delnan а как насчет того, как вы пытаетесь выполнить 'dir (4)' или 'print (4) .imag' перед тем, как перейти к выводам? – dmg

ответ

4

Все номера в Python (и строки тоже) неизменяемы. Это упрощает вычисления несколькими способами (т. Е. Делает интерпретатор Python более результативным) и, как правило, не вызывает особых проблем.

Для повторного использования значения из другого значения, вы можете просто сделать это, конечно:

x = complex(2, x.imag) 
+2

Многие другие вещи неизменны. Например, кортежи и все случаи namedtuples. Некоторые другие коллекции тоже («frozenset» приходит на ум, хотя это кажется довольно неясным). Не говоря уже о типах нестандартной библиотеки, хотя мои неизменные типы обычно заканчиваются как namedtuples. – delnan

+0

Я часто использую фенизоны в качестве словарных клавиш. На самом деле для меня довольно редко используется какой-либо тип последовательности в качестве «аккумулятора», предпочитающий итераторы и список/словарь/набор-понимания, поэтому изменчивые последовательности встречаются редко в моем коде (я, конечно, верну свои списки однородных предметы просто ради согласия). Это зависит от проблемной области. – marr75

+0

+1: Отличный ответ. Короче говоря, давая подробные сведения, которые полезны для этого вопроса (а не подробное изложение всех неизменяемых типов, поскольку, как представляется, предпочтительные комментарии). – tom10

1

Вкратце:

Как изменить комплексное число в Python без построения новый комплекс?

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

Любые идеи, почему комплекс был реализован следующим образом?

Комплексные номера являются числовым и, как и все числовые типы python, неизменяемы.

Longer объяснение:

Вы не можете изменить int, float, namedtuple или frozenset больше, чем вы можете изменить комплексное число. Сложные числа неизменяемы, что имеет свои преимущества (одним из наиболее важных среди них является то, что вы можете использовать сложные номера в качестве словарных клавиш). Большинство операций, которые вы выполняете со сложными числами, по-прежнему являются математическими и, следовательно, поддаются неизменности (как и все другие числовые типы). Если это не так, подумайте о создании собственного класса, возможно, с атрибутом __slots__.

Мой совет: некоторые разработчики стремятся к неизменности в своих структурах данных. Это делает программирование и отладку существенно менее сложными. Комплексные номера в python были хорошо разработаны.

1

Есть несколько причин для неизменных чисел языка Python:

1) Это экономит память, позволяя несколько переменных, чтобы указать один и тот же объект:

>>> x = 3 + 4j 
>>> y = x 
>>> x is y 
True 

2) Неизменность идет рука об руку с hashability , Это делает номер подходит для использования в качестве ключей словаря и элементов множеств:

>>> d = {} 
>>> d[3 + 4j] = 'red' 
>>> d[3 + 4j] 
'red' 

3) С помощью настраиваемого управления памятью Пайтона, эти объекты, как правило, чтобы получить повторно использовать вместо того, чтобы повторно выделяются и освобождается. Это уменьшает стоимость «создания новых объектов».

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

  • Нет связанных вопросов^_^