如何修改Python复数

2 投票
3 回答
2696 浏览
提问于 2025-04-17 19:39

一旦创建,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中修改一个复数,而不需要重新构造一个新的复数呢?这看起来像是一个不必要的限制。有没有人知道为什么复数是这样设计的?

3 个回答

1

简而言之:

我怎么能在Python中修改一个复数,而不创建一个新的复数?

你不能。你可以使用旧复数的元素(如果你经常这样做,可以写个函数来处理),或者自己创建一个复数类。

有人知道为什么复数是这样实现的吗?

复数是一种数字类型,就像Python中的其他数字类型一样,它们是不可变的。

详细解释:

你不能修改一个 intfloatnamedtuplefrozenset,复数也是一样。复数是不可变的,这有一些好处(其中一个最重要的好处是你可以把复数用作字典的键)。你对复数进行的大多数操作仍然是数学运算,因此它们适合不可变性(就像其他所有数字类型一样)。如果不是这样,考虑创建你自己的类,可能还要加上一个 __slots__ 属性。

我的建议是:一些开发者在他们的数据结构中追求不可变性。这会让编程和调试变得简单得多。Python中的复数设计得很好。

2

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

1) 它节省内存,因为多个变量可以指向同一个对象:

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

2) 不可变性和可哈希性是相辅相成的。这使得数字适合用作字典的键和集合的元素:

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

3) 在Python的内存管理中,这些对象通常会被重复使用,而不是不断地分配和释放。这减少了“创建新对象”的成本。

4

在Python中,所有的数字(还有字符串)都是不可变的。这意味着一旦你创建了一个数字或字符串,它就不能被改变。这种特性在很多方面让计算变得更简单,比如让Python的运行速度更快,而且通常不会带来太多麻烦。

如果你想重复使用某个值,可以直接这么做:

x = complex(2, x.imag)

撰写回答