我在创建二维数组时遇到问题

时间:2020-08-04 15:53:09

标签: python-3.x list multidimensional-array

我定义了一个更改列表的功能(基本上将最后一项移到列表的开头),然后我尝试使用此功能创建2d列表。

这是一些代码:

prevRow = ["blue", "yellow", "red", "black", "white"]
def nextRow():
    prevRow.insert((0, prevRow.pop()))
    print(prevRow)
    return  prevRow
tablePreset = [["blue", "yellow", "red", "black", "white"], nextRow(), nextRow(), nextRow(), nextRow()]
print(tablePreset)
prevRow = ["blue", "yellow", "red", "black", "white"]
tablePreset = [["blue", "yellow", "red", "black", "white"]]
def nextRow():
    prevRow.insert((0, prevRow.pop()))
    print(prevRow)
    return  prevRow
for _ in range(4):
    tablePreset.append(nextRow())
print(tablePreset)

在两种情况下我都知道了

['white', 'blue', 'yellow', 'red', 'black']
['black', 'white', 'blue', 'yellow', 'red']
['red', 'black', 'white', 'blue', 'yellow']
['yellow', 'red', 'black', 'white', 'blue']
[['blue', 'yellow', 'red', 'black', 'white'], ['yellow', 'red', 'black', 'white', 'blue'], ['yellow', 'red', 'black', 'white', 'blue'], ['yellow', 'red', 'black', 'white', 'blue'], ['yellow', 'red', 'black', 'white', 'blue']]

我不知道为什么,但是即使我调用了4次函数,列表中的每个返回值都与最后一个值相同(该函数内部的打印用于调试目的)。

如果有人帮助我,我会非常满足的:)

1 个答案:

答案 0 :(得分:0)

每次将列表传递给函数nextRow时,都需要复制该列表(请参见下面的代码)。 here(相关主题)的更多信息。

prevRow = ["blue", "yellow", "red", "black", "white"]
tablePreset = [["blue", "yellow", "red", "black", "white"]]

def nextRow(prevRow):
    prevRow_copy = prevRow.copy()
    prevRow_copy.insert(0, prevRow_copy.pop())
    return prevRow_copy

for _ in range(4):
    prevRow = nextRow(prevRow)
    tablePreset.append(prevRow)
    
print(tablePreset)

# >> out:
# [['blue', 'yellow', 'red', 'black', 'white'],
#  ['white', 'blue', 'yellow', 'red', 'black'],
#  ['black', 'white', 'blue', 'yellow', 'red'],
#  ['red', 'black', 'white', 'blue', 'yellow'],
#  ['yellow', 'red', 'black', 'white', 'blue']]

另一个说明副本重要性的小例子:

a = []
b = [1,2,3]

a.append(b)
b.pop()
a.append(b)
b.pop()
a.append(b)

print(a)

# >> out:
# [[1], [1], [1]]

a = []
b = [1,2,3]

a.append(b.copy())
b.pop()
a.append(b.copy())
b.pop()
a.append(b.copy())

print(a)

# >> out:
# [[1, 2, 3], [1, 2], [1]]