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

如何在 Python 中修改复数而不构造新的复数?这似乎是一个不必要的限制。任何想法为什么复杂是这样实现的?

4

3 回答 3

4

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

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

x = complex(2, x.imag)
于 2013-03-19T16:00:02.103 回答
2

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

1)它通过允许多个变量指向同一个对象来节省内存:

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

2) 不变性与哈希性密切相关。它使数字适合用作字典键和集合的元素:

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

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

于 2013-03-19T16:32:18.110 回答
1

简单来说:

如何在 Python 中修改复数而不构造新的复数?

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

任何想法为什么复杂是这样实现的?

复数是一种数字类型,并且与所有 Python 数字类型一样,是不可变的。

更长的解释:

您不能修改 a int、 a float、 anamedtuple或 a ,frozenset就像您不能修改复数一样。复数是不可变的,它具有优势(其中最重要的一个是您可以将复数用作字典键)。您对复数执行的大多数操作仍然是数学运算,因此具有不变性(与所有其他数字类型一样)。如果不是这种情况,请考虑创建自己的类,可能带有__slots__属性。

我的建议:一些开发人员力求其数据结构的不变性。它大大降低了编程和调试的复杂性。python中的复数设计得很好。

于 2013-03-19T16:05:58.343 回答