当我只在python中更改列表中的一行时,为什么所有行都会更改?

时间:2016-03-06 17:47:19

标签: python

我写了一个搜索宝藏的代码。正如代码所示,当我放下声纳时,它会显示胸部的提示。但是,在我的代码中,所有行都将更改。我真的不知道为什么。我希望有人可以帮助我。非常感谢!

insertToDB = function() {

    var url_list = Session.get('url_list');
    Products.insert({
        'url_list': url_list
    });
    Session.set('url_list', []); // To empty the client-side list

}

2 个答案:

答案 0 :(得分:1)

在python列表中是可变的。此外,当您在另一个列表中插入列表时,存储的是引用。

看看如果运行此代码会发生什么(我使用与getChest方法中相同的变量名称)

aList = [1,2,3]
chests=[]
chests.append(aList)
chests.append(aList)

print chests
aList[0] = 999
print chests

您可以在任何python书中搜索“reference”和“mutable”这两个术语,以获得更全面的解释。还可以查看copy模块(查找“深拷贝”和“浅拷贝”概念)。

答案 1 :(得分:1)

在您的get_board功能中,您正在创建colume,然后一遍又一遍地将其附加到主机上 - 但这并不是每次都创建一个新列表,而是'是同一个对象。

def get_board(self):
    colume=['~']*60
    for y in range(0,15):
        self.board.append(colume)
    return self.board

每次此功能执行self.board.append(colume)时,它都没有"添加' colume'的内容。在#self; board'"结束时,它会说"添加另一个参考' colume' to self.board",以便self.board中的每个条目都是同一个对象。您可以使用id对此进行测试,以获取对象的内部标识符。它应该是不同的。当我尝试时:

>>> board = list()
>>> colume=['~']*60
>>> for y in range(0,15):
...     self.board.append(colume)
>>> id(board[0])
140498301136840
>>> id(board[1])
140498301136840
>>> id(board[2])
140498301136840

相反,如果你这样做:

>>> board = list()
>>> for y in range(0,15):
...     board.append(['~'] * 60)
>>> id(board[0])
140498301203376
>>> id(board[1])
140498301176432
>>> id(board[2])
140498301204456

所有不同的对象,并且更改一个对象并不会更改其他对象'董事会。