【问题标题】:Appending list to another Python list appends [duplicate]将列表附加到另一个 Python 列表追加 [重复]
【发布时间】:2014-11-18 09:25:05
【问题描述】:

我有一个问题,当我将一维列表作为行多次附加到二维列表时,对二维列表的后续更改会影响所有行。该线程 (Python list confusion) 解释了为什么会出现这种情况 - 基本上每一行都是相同的子列表或对象,因此对该子列表的更改会更改 2D 列表中的每一行。但是,我不知道如何解决它。这是我的例子:

NumOfRows = 100
LanesToCheck = [0, 1, 2, 3]
Lanes = []
for j in range(0,NumOfRows):
    Lanes.append(LanesToCheck)

LanesToCheck 用于初始化每一行,其想法是我的脚本的用户可以在一个简单的代码位置更改这个一维列表,并用它初始化整个二维数组。我知道我可以使用:

Lanes.append([0, 1, 2, 3])

但我希望用户可以轻松访问此 LanesToCheck 常量。有没有办法使用这个一维数组初始化我的二维数组,每行都是一个单独的实体?

【问题讨论】:

    标签: python arrays list


    【解决方案1】:

    使用这个:-

    Lanes = [LanesToCheck[:] for j in range(NumOfRows)] 
    # makes copy of `LanesToCheck` every time.
    

    您可以通过这样做将每一行用作单独的实体,

    Lanes[0][0] = 11
    

    如果您将11 插入到您的第一行第一列,那么其他行将保持不变。

    输出:-

    [[11, 1, 2, 3], [0, 1, 2, 3], ...... and so on
    

    【讨论】:

    • 你甚至可以使用列表理解:Lanes = [ LanesToCheck[:] for j in range(NumOfRows) ]
    • @SergeBallesta 我刚刚描述过单独使用行,谢谢,我现在更新我的答案。
    【解决方案2】:
    Lanes = [0,1,2,3] * NumOfRows
    

    非常pythonic - 但错误:-(

    也许,如果您想明确说明您正在制作列表的副本:

    import copy
    Lanes = [copy.deepcopy(LanesToCheck) for i in xrange(NumOfRows)]
    

    【讨论】:

    • 也许是 pythonic 但回答问题! [0,1,2,3] * 2 给出[0,1,2,3,0,1,2,3] 1D 列表而不是列表列表。甚至[[0,1,2,3]] * NumOfRows 使用相同的内部列表实例:x = [[0,1,2,3]] * 2 x[0][0] = 11 给出[[10, 1, 2, 3], [10, 1, 2, 3]]
    • 你是对的,对不起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2015-07-11
    • 2020-10-29
    • 2012-02-01
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多