一、问题描述
笔者最近在做一个Python量子计算相关的项目时,遇到如下报错:
TypeError: 'tuple' object does not support item assignment
报错截图:
出错的部分代码如下:
def integral_orthonomality(x, n1, n2):
return verphi(n1, x) * x * verphi(n2, x)
for n1 in range(n_max + 1):
for n2 in range(n_max + 1):
result = integrate.quad(
integral_orthonomality,
x_min, x_max,
args=(n1, n2)
)
result[0] /= L # 出错行
if result[0] < L:
result[0] = 0
print("(" + str(n1) + ", " + str(n2) + ") " + str(result[0]))
其中变量result为一个积分运算的数值结果,目的是将 result[0] 输出,且在输出前先除以一个定值,并做近似。
二、解决过程
1、 从报错信息中看出,引发该问题的原因是“元组对象不支持赋值操作”。首先(注释掉问题代码),添加几句,看数据类型:
for n1 in range(n_max + 1):
for n2 in range(n_max + 1):
result = integrate.quad(
integral_orthonomality,
x_min, x_max,
args=(n1, n2)
)
print(result)
print(type(result))
print(type(result[0]))
# result[0] /= L
# if result[0] < L:
# result[0] = 0
print("(" + str(n1) + ", " + str(n2) + ") " + str(result[0]))
运行结果:
可以看出,变量result为包含2个浮点数的元组,但元组对象无法直接对其进行赋值。
2、 解决方法比较容易,另外定义一个变量float_result来存储原本 result[0] 的值即可。修改后的代码如下:
for n1 in range(n_max + 1):
for n2 in range(n_max + 1):
result = integrate.quad(
integral_orthonomality,
x_min, x_max,
args=(n1, n2)
)
float_result = float(result[0])
float_result /= L
if float_result < 1.0 * 10 ** -9:
float_result = 0
print("(" + str(n1) + ", " + str(n2) + ") " + str(float_result))
报错消失,问题解决。
三、参考文献
《14天自造量子计算机(Python版)》,【日】远藤理平 著,陈欢 译,北京,中国水利水电出版社,2023年9月。