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