快速查看解决方案
错误提示
Traceback (most recent call last):
File “a.py”, line 9, in <module>
v[i],w[i] = map(int,input().split())
TypeError: ‘int’ object does not support item assignment
错误代码
N = 1010
f = [[0] * N for i in range(N)]
w = [0] * N
v = [0] * N
if __name__ == '__main__':
n,v = map(int,input().split())
for i in range(n):
v[i],w[i] = map(int,input().split())
for i in range(n):
for j in range(v):
f[i][j] = f[i - 1][j]
if j >= v[i]:
f[i][j] = max(f[i][j],f[i - 1][j - v[i]] + w[i])
print(f[n][v])
输入样例
5 5
1 1
2 2
3 3
4 4
5 5
ps:这是背包问题的代码。在第9行报了TypeError错误。
错误分析
- 这是TypeError(类型错误),经过一番检查,初步排除了算法思路导致错误的可能。
- 核对了题目中数据的输入格式和输入样例,排除了格式上的错误。
- 排除python语法使用不当导致的错误。
经过多方的观察和网上资料的搜索,依旧没能解决我的问题。
之后我从中提取了错误的代码,并定位到了错误的存在。
请看一下代码
v = 31
v[1] = 31
其报错提示为:
Traceback (most recent call last):
File “a.py”, line 2, in <module>
v[1] = 31
TypeError: ‘int’ object does not support item assignment
于是错误原因便显而易见了
错误原因和修正
这是由于列表和变量重名导致的错误。
v = 31
v[1] = 31
就这个代码来说,第一行初始化了v
为一个·int
型的变量。
而第二行则把v
当成了一个列表,对其中的第1
号元素进行了赋值。
因此错误就发生了。
TypeError(类型错误),‘int’ object does not support item assignment(int
对象不支持项目赋值)
原代码中,之所以会出现这样的错误,也是因为变量名和列表名的复用,而究其根本,便是我对于代码中的变量名和列表名没有提前做好规划。
将列表名/变量名做修改,避免错误的发生,即可解决此问题。
处理完的代码如下所示。
N = 1010
f = [[0] * N for i in range(N)]
W = [0] * N
V = [0] * N
if __name__ == '__main__':
n,v = map(int,input().split())
for i in range(n):
V[i],W[i] = map(int,input().split())
for i in range(n):
for j in range(v):
f[i][j] = f[i - 1][j]
if j >= V[i]:
f[i][j] = max(f[i][j],f[i - 1][j - V[i]] + W[i])
print(f[n][v])
建议和反思
为题目中的变量命名形成自己的规则和习惯,是避免出现此问题的一个好方法。
比如同一列表名首字母大写,变量遵循小驼峰式命名规则,则可以很大程度上避免列表和变量直接的命名冲突。
对于一道程序设计题,在以迅雷不及掩耳之势敲完代码前,还应该对其中的每一个变量名列表名提前做好规划,避免命名冲突的错误。
原创不易,感谢您的支持。