Python复数构造与属性访问结果疑问及原理咨询
Python复数运行机制详解
一、关于complex()构造函数的疑问
首先明确Python中complex()的正确用法:它的语法是complex(real[, imag]),规则如下:
- 只传一个参数时,参数可以是整数、浮点数或复数,返回对应的复数(比如
complex(5)是5+0j,complex(3+4j)还是3+4j)。 - 传两个参数时,第二个参数必须是整数或浮点数(不能是复数),返回的结果是
real + imag*1j(比如complex(20,15)就是20+15j)。 - 如果第一个参数是复数,绝对不能传第二个参数,否则会直接报错
TypeError: complex() second argument can't be a complex number。
你给出的complex(20+10j,5+5j)理论上会报错,而你得到的15+15j更像是执行了(20+10j) - (5-5j)的结果(计算过程:实部20-5=15,虚部10+5=15);同理complex(10+10j,5+5j)得到5+15j,对应(10+10j)-(5-5j)的计算结果。大概率是你混淆了complex()的用法和复数运算。
二、关于31+5j.real和31+5j.imag的结果
这里核心是运算符优先级:Python中属性访问(.real、.imag)的优先级比加法高,所以会先执行属性获取,再做加法:
5j是虚部为5的复数,它的.real属性是实部,也就是0.0;所以31 + 5j.real等价于31 + 0.0,整数加浮点数会自动转为浮点数,结果就是31.0。5j.imag是它的虚部,值为5.0;31 + 5.0的结果是36.0,同样是浮点数类型。
三、关于42.real和42.imag的疑问
首先注意:整数后面直接写.会被Python解析为小数点,所以42.real会触发语法错误,正确写法是(42).real。
Python把整数、浮点数都视为“虚部为0的复数”,所以它们的.real和.imag属性规则是:
- 整数/浮点数的
.real就是它本身(比如(42).real返回42,(3.14).real返回3.14)。 - 整数/浮点数的
.imag永远是0(比如(42).imag返回0)。
你说42.imag输出42,应该是输入错误,大概率是把42j写成了42——复数42j的.imag属性是42.0,符合你描述的结果。
内容的提问来源于stack exchange,提问作者Aaron Alex
相关产品推荐
相关产品推荐

