首页 > 解决方案 > 列表:改变价值观,这里到底发生了什么?

问题描述

我在 python 中有一个简单的二维列表。我通过逐行读取文本文件并使用 .split() 方法将其分割、转换为浮点数来创建它,一切看起来都很好。我立即按索引打印列表,看起来不错。我第二次这样做,突然它只包含原始列表的最后一个索引中的内容。除了 split() 和 float 赋值外,我从顶部循环复制了代码以创建第二个循环:

dataLinesStr = ["1 2 3 4 5", "6 7 8 9 10", "11 12 13 14 15", "16 17 18 19 20", "21 22 23 24 25"]
numLines = len(dataLinesStr)
numPix = 5
lineData = [[0.0] * numPix] * numLines  # Refer as:  lineData[numLines][numPix]
r = 0
while r < numLines:
    tmpStr = dataLinesStr[r].split()  # a list of strings.
    p = 0
    while p < numPix:
        lineData[r][p] = float(tmpStr[p])
        if r < 3: print("[" + str(r) + "][" + str(p) + "]lineData = ", lineData[r][p])
        p += 1
    r += 1

print("2nd time....")
r = 0
while r < numLines:
    p = 0
    while p < numPix:
        if r < 3: print("[" + str(r) + "][" + str(p) + "]lineData = ", lineData[r][p])
        p += 1
    r += 1

输出是:

[0][0]lineData =  1.0
[0][1]lineData =  2.0
[0][2]lineData =  3.0
[0][3]lineData =  4.0
[0][4]lineData =  5.0
[1][0]lineData =  6.0
[1][1]lineData =  7.0
[1][2]lineData =  8.0
[1][3]lineData =  9.0
[1][4]lineData =  10.0
[2][0]lineData =  11.0
[2][1]lineData =  12.0
[2][2]lineData =  13.0
[2][3]lineData =  14.0
[2][4]lineData =  15.0
2nd time....
[0][0]lineData =  21.0
[0][1]lineData =  22.0
[0][2]lineData =  23.0
[0][3]lineData =  24.0
[0][4]lineData =  25.0
[1][0]lineData =  21.0
[1][1]lineData =  22.0
[1][2]lineData =  23.0
[1][3]lineData =  24.0
[1][4]lineData =  25.0
[2][0]lineData =  21.0
[2][1]lineData =  22.0
[2][2]lineData =  23.0
[2][3]lineData =  24.0
[2][4]lineData =  25.0

两个循环之间没有变量操作,但只有原始列表中的最后一个元素出现在第二个循环中。我一直在为这件事发疯。我看不出发生这种情况的可变与非可变原因。有人看到这里有什么问题吗?

标签: pythonlistmultidimensional-array

解决方案


推荐阅读