如何修改python复数

如何修改python复数,python,complex-numbers,readonly,Python,Complex Numbers,Readonly,一旦创建,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 >x=complex(1,1) >>>x (1+1j) >>>x.real=2 回溯(

一旦创建,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
>x=complex(1,1)
>>>x
(1+1j)
>>>x.real=2
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:只读属性
如何在Python中修改复数而不构造新的复数?这似乎是一个不必要的限制。你知道为什么complex是这样实现的吗?

Python中的所有数字(以及字符串)都是不可变的。这在几个方面使计算更容易(即,它使Python解释器的性能更高),并且通常不会造成太多麻烦

要重用来自另一个值的值,您当然可以这样做:

x = complex(2, x.imag)
简言之:

如何在Python中修改复数而不构建新的 复杂的

你没有。您可以使用旧复数的元素(如果您发现自己经常这样做,您可以编写一个函数来这样做),也可以创建自己的复数类

你知道为什么complex是这样实现的吗

复数是一种数字类型,与所有python数字类型一样,是不可变的

详细解释:

不能修改
int
float
namedtuple
frozenset
,就像不能修改复数一样。复数是不可变的,这有很多优点(其中最重要的一点是可以将复数用作字典键)。您将对复数执行的大多数操作仍然是数学操作,因此具有不变性(与所有其他数字类型一样)。如果不是这样的话,考虑创建自己的类,可能使用<代码>
我的建议是:一些开发人员努力在他们的数据结构中实现不变性。它大大降低了编程和调试的复杂性。python中的复数设计得很好。

python中的数字不可变有几个原因:

1) 它允许多个变量指向同一对象,从而节省内存:

>>> x = 3 + 4j
>>> y = x
>>> x is y
True
2) 不变性与散列性密切相关。它使数字适合用作字典键和集合元素:

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

3) 通过Python的自定义内存管理,这些对象往往会被重用,而不是被重复分配和释放。这降低了“创建新对象”的成本。

原因与您不能执行
a=4
a.real=10
@DJV不一样,在您的示例中,它还会神奇地改变类型,这更糟。@delnan您试试
dir(4)
print(4)怎么样.imag
在得出结论之前?@DJV类型不仅由其
\uuuuu dir\uuuuu
方法返回的内容(是的,这就是
dir
调用的内容)或它支持的属性(尽管通常情况下,这已经足够了——请参阅duck typing)。检查
类型(4)
类型(1j)
,或者只注意它们在各种操作(如
math.sqrt
)中非常不同的行为。4是一个整数,正好表示它没有虚部。复数不是整数,无论在数学上还是在Python中都不是。@delnan那么
A.real=10
到底是如何改变类型的呢?还是你根本就没有得到我的评论?我们的想法是,尽管整数和浮点数也有
.real
.imag
,但它们不能对整数和浮点数(不仅仅是复数)执行相同的操作。许多其他东西也是不可变的。例如,元组和namedtuple的所有情况。还有一些其他的收藏(
frozenset
浮现在脑海中,尽管这似乎相当模糊)。更不用说非标准库类型,尽管我的不可变类型通常以namedtuples结束。我经常使用frozenset作为字典键。事实上,我很少使用任何类型的序列类型作为“累加器”,更喜欢迭代器和列表/字典/集合理解,因此可变序列在我的代码中很少见(当然,我会返回同构项的列表,只是为了惯例)。这取决于问题的领域。+1:回答得很好。简而言之,给出对这个问题有用的细节(而不是像上面的评论那样详细阐述所有不变的类型)。虽然我认为djc的答案是好的,但我完全不同意tom10的评估。OP问1)Q:我如何在不构建新的复数的情况下修改复数a:你没有,2)Q:为什么复数是以这种方式实现的?答:它们是一种不可变的类型,就像所有其他数字一样。@tom10我想我已经在上面的答案编辑中解决了您的问题。请看一看并重新评估您的投票。