0 问题描述
学习Numpy时,有一段Python和Numpy的对比,其中一段代码如下:
# code_1
# Python版本: 3.5.2
# 操作系统: Ubuntu 16.04
def pythonsum(n):
a = range(n)
b = range(n)
c = []
for i in range(len(a)):
a[i] = i ** 2
b[i] = i ** 3
c.append(a[i] + b[i])
return c
运行提示错误
TypeError: ‘range’ object does not support item assignment
经搜索查阅,这是Python版本问题导致的。
我当前的Python版本为3.5.2
1 知识点
Python 2中,range()返回一个整数列表(list),代码示例如下:
# code_2
# Python版本: 2.7.12
# 操作系统: Ubuntu 16.04
>>> range(5)
[0, 1, 2, 3, 4]
>>> range(0,5)
[0, 1, 2, 3, 4]
>>> range(0,10,2)
[0, 2, 4, 6, 8]
Python 3中,range()返回一个range对象(object),代码示例如下:
# code_3
# Python版本: 3.5.2
# 操作系统: Ubuntu 16.04
>>> range(5)
range(0, 5)
>>> range(0,5)
range(0, 5)
>>> range(0,5,1)
range(0, 5)
>>> range(0,10,2)
range(0, 10, 2)
因此code_1中的a和b为range对象,所以后面的a[i] = i ** 2
和b[i] = i ** 3
就出错了。
2 解决办法
在Python3中,如果想利用range()函数生成列表,可以利用list()函数将range对象强制转换为list类型,代码如下:
# code_4
# Python版本: 3.5.2
# 操作系统: Ubuntu 16.04
>>> range(5)
range(0, 5)
>>> list(range(5))
[0, 1, 2, 3, 4]
所以code_1修改如下:
# code_5
# Python版本: 3.5.2
# 操作系统: Ubuntu 16.04
def pythonsum(n):
a = list(range(n))
b = list(range(n))
c = []
for i in range(len(a)):
a[i] = i ** 2
b[i] = i ** 3
c.append(a[i] + b[i])
return c