1. 列表通过 append 添加元素时添加的是对象的引用,列表通过 append 等方法进行操作时不改变引用
错误代码
import numpy as np
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a = []
b = []
for i in range(data.shape[0]):
a.clear()
for j in range(data.shape[1])):
a.append(data[i][j])
b.append(a)
print(a) # [7, 8, 9]
print(b) # [[7, 8, 9], [7, 8, 9], [7, 8, 9]]
错误分析
本例的目的是通过建立一个临时变量 a ,来将数组中的内容复制到列表 b 中。当然,这只是为了说明问题而随便写的一段代码,不具有实际作用。
实际上,列表 b 通过 append 方法新增了一个元素 a 后,列表中的元素和 a 此时引用自同一个对象,而 a 再通过 clear 和 append 方法进行操作时,引用不变,此时,改变了 a 也就改变了列表 b 中的元素。但是,若 a 通过赋值方式改变数值,则相当于引用了新的对象,此时改变 a 则列表 b 中的元素不受影响。
2. Numpy 数组中每个元素占用内存大小是固定的,修改元素值时不能超越对应的内存大小
错误代码
import numpy as np
import sys
a = np.load('image_name.npy')
print(a[0]) # 047b0428bd6841b872023ac8ae1c69c9.jpeg
print(type(a[0])) # <class 'numpy.str_'>
a[0] = a[0] + 'python'
print(a[0]) # 047b0428bd6841b872023ac8ae1c69c9.jpeg
print(a[0] + 'python') # 047b0428bd6841b872023ac8ae1c69c9.jpegpython
print(type(a[0] + 'python')) # <class 'str'>
a[0] = 'python'
print(a[0]) # python
print(sys.getsizeof(a[0])) # 118
print(sys.getsizeof(np.str_('047b0428bd6841b872023ac8ae1c69c9.jpeg'))) # 118
print(sys.getsizeof(np.str_('047b0428bd6841b872023ac8ae1c69c9.jpegpython'))) # 124
错误分析
a[0] 占用内存大小为 118 ,因此将一个占用内存大小为 124 的字符串赋值给 a[0] 时,只能将截取前面的部分,而无法实现我们想要进行的字符串拼接操作。
获取更多精彩,请关注「seniusen」!
seniusen
网友评论