为何这段Python代码未抛出不支持的操作数错误?
为何numpy数值与列表相加未触发TypeError?
问题场景
以下代码中,原本预期X.extend行因float + list的操作抛出类型错误,但实际运行正常;仅当把np.cos(fwd_angle)替换为原生float值0.5时,才会触发预期的TypeError:
import numpy as np X = [1., 2., 3.] Y = [1., 2., 3.] fwd_angle = 60.*np.pi/180. for i in range(3): X.extend( X[i + 1] * np.cos(fwd_angle) + [X[i] + np.sin(fwd_angle)] ) Y.extend( [Y[i + 1] * np.cos(fwd_angle) + Y[i] + np.sin(fwd_angle)] ) print(X) print(Y)
核心原因
问题出在numpy数值类型与Python原生数值类型的运算符重载差异:
np.cos(fwd_angle)返回的是numpy.float64类型,而非Python原生float。numpy为这类数值重载了+运算符,当它与列表相加时,会自动把列表转换为numpy数组,执行广播元素相加,最终返回一个numpy数组。list.extend()方法接受所有可迭代对象作为参数,numpy数组属于可迭代对象,因此能被正常处理,不会报错。
而当你替换为原生float(0.5)时,Python原生float没有定义与列表相加的逻辑,自然会抛出TypeError: unsupported operand type(s) for +: 'float' and 'list'。
验证示例
import numpy as np # numpy数值与列表相加,返回numpy数组 print(np.float64(0.5) + [1.0]) # 输出: array([1.5]) # 原生float与列表相加,触发错误 print(0.5 + [1.0]) # 抛出TypeError
内容的提问来源于stack exchange,提问作者screenpaver
相关产品推荐
相关产品推荐

