创建后,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 中修改复数而不构造新的复数?这似乎是一个不必要的限制。任何想法为什么复杂是这样实现的?
创建后,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 中修改复数而不构造新的复数?这似乎是一个不必要的限制。任何想法为什么复杂是这样实现的?
Python 中的所有数字(以及字符串)都是不可变的。这使得计算在几个方面变得更容易(即,它使 Python 解释器的性能更高)并且通常不会造成太大的麻烦。
要重用另一个值的值,您当然可以这样做:
x = complex(2, x.imag)
Python 的不可变数字有几个原因:
1)它通过允许多个变量指向同一个对象来节省内存:
>>> x = 3 + 4j
>>> y = x
>>> x is y
True
2) 不变性与哈希性密切相关。它使数字适合用作字典键和集合的元素:
>>> d = {}
>>> d[3 + 4j] = 'red'
>>> d[3 + 4j]
'red'
3) 使用 Python 的自定义内存管理,这些对象往往会被重复使用,而不是被重复分配和释放。这降低了“创建新对象”的成本。
简单来说:
如何在 Python 中修改复数而不构造新的复数?
你没有。您可以使用旧复数的元素(如果您发现自己经常这样做,您可以编写一个函数来这样做)或创建自己的复数类。
任何想法为什么复杂是这样实现的?
复数是一种数字类型,并且与所有 Python 数字类型一样,是不可变的。
更长的解释:
您不能修改 a int
、 a float
、 anamedtuple
或 a ,frozenset
就像您不能修改复数一样。复数是不可变的,它具有优势(其中最重要的一个是您可以将复数用作字典键)。您对复数执行的大多数操作仍然是数学运算,因此具有不变性(与所有其他数字类型一样)。如果不是这种情况,请考虑创建自己的类,可能带有__slots__
属性。
我的建议:一些开发人员力求其数据结构的不变性。它大大降低了编程和调试的复杂性。python中的复数设计得很好。