2013-03-19 55 views
2

一旦创建,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中修改复数?这似乎是一个不必要的限制。任何想法为什么复杂这样实现?

+0

非常出于同样的原因,你不能'a = 4'然后'a.real = 10'。 – dmg 2013-03-19 16:01:13

+0

@DJV不,在你的例子中,它也会奇迹般地改变类型,这更糟糕。 – delnan 2013-03-19 16:03:56

+3

@delnan在跳到结论之前,你如何尝试'dir(4)'或'print(4).imag'? – dmg 2013-03-19 16:05:40

回答

4

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

从另一个值回用价值,你可以做到这一点,当然是:

x = complex(2, x.imag) 
+2

许多其他的东西也是不可变的。例如,元组和所有命名的例子。其他一些收藏也会出现(“冰冷的”),但这似乎很模糊。更不用说非标准库类型,尽管我的不可变类型通常以namedtuples结尾。 – delnan 2013-03-19 16:03:04

+0

我经常使用frozensets作为字典键。事实上,这是非常罕见的,我使用任何类型的序列类型为“蓄电池”,宁愿迭代器和目录列表/词典/套 - 解析,所以可变序列是罕见的在我的代码(我会的均质过程返回列表项目仅仅是为了约定)。这取决于问题域。 – marr75 2013-03-19 16:06:58

+0

+1:优秀的答案。简而言之,给出对这个问题有用的细节(而不是像上述评论似乎更喜欢所有不可变类型的详细说明)。 – tom10 2013-03-19 16:16:02

1

内容摘要:

如何修改Python中的复杂的数字,没有构建新 复杂?

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

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

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

更详细的解释:

不能修改int,一个float,一个namedtuple,或frozenset比你可以修改复数了。复数是不可改变的,它具有优点(其中最重要的一点是可以使用复数作为字典键)。你最多只能使用复数执行的操作仍然是数学,所以借给自己不变性(像所有其他数字类型)。如果不是这种情况,请考虑创建自己的班级,可能需要__slots__属性。

我的建议是:一些开发商争取自己的数据结构的不变性。它使编程和调试大大简化。 python中的复数是精心设计的。

1

有对Python的不可变的号码有几个原因:

1)它允许多个变量指向同一个对象节约内存:

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

2)不变性去手牵手与hashability 。它使数字适合用作套字典键和元素:

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

3)使用Python的定制内存管理,这些对象往往会得到重新利用,而不是被反复分配和释放。这减轻了“创建新对象”的成本。