今天这真的让我很困惑。这是我能得到的最小工作示例:
array = [ 1, 2, 1, 3, 4 ]
n = 3
strips = [[0] * n] * n
mSum = 7
j = 0
strips[0][j] = mSum
print(f'before strips[0]: {strips[0][0]}')
for i in range(1, len(array) - n + 1):
mSum += array[i + n - 1] - array[i - 1]
strips[i][j] = mSum
print(f'strips[{i}][{j}]: {strips[i][j]}')
print(f'after strips[0]: {strips[0][0]}')
如果
strips
不是嵌套列表,则不会发生该错误。这是输出:
before strips[0][0]: 7
strips[1][0]: 9
strips[2][0]: 11
after strips[0][0]: 11
为什么
strips[0][0]
在循环之前和之后不同(没有被修改)?我唯一能想到的是它与mSum
有某种联系。
C++ 等语言中的相同代码不存在此问题。
从常用序列操作可知,s * n 相当于将 s 加自身 n 次。您创建了一个包含
n
个零的列表,然后将该列表添加到外部列表 n
次。现在您拥有了对单个列表的大量引用。
Python 的
list
就像 C++ std::list
,而不是像 int test[10][10];
。