改变列表列表中的值

时间:2014-03-23 18:05:30

标签: python list

board = [['a']*3]*2
board[0][0] = 'b'

...然后board变为[['b','a','a'],['b','a','a']]

有没有办法改变它,使它变成......?

[['b','a','a'],['a','a','a']]?

感谢。

3 个答案:

答案 0 :(得分:1)

初始化列表的方式导致了问题。

>>> board = [['a']*3]*2
>>> board
[['a', 'a', 'a'], ['a', 'a', 'a']]
>>> board[0][0] = 'b'
>>> board
[['b', 'a', 'a'], ['b', 'a', 'a']]

VS

>>> board = [['a', 'a', 'a'], ['a', 'a', 'a']]
>>> board[0][0] = 'b'
>>> board
[['b', 'a', 'a'], ['a', 'a', 'a']]

在第一种方法中,由于您初始化它的方式,board[0]board[1] 是相同的列表。这与您不以这种方式在函数中定义默认参数的原因相同:

def f(a, b=[]):

而不是:

def f(a, b=None):
    if b = None:
        b = []

答案 1 :(得分:1)

您的代码与以下内容相同:

x = ['a', 'a', 'a']
board = [x, x]

board只是x的两个副本。 xboard[0]board[1]都引用相同的python对象,并对其中任何一个进行了修改,其中包括三个"三个"列表实际上是对同一基础列表的修改。

尝试

board = [['a'] * 3 for i in range(2)]

编辑:如果你想使用numpy,这是一个潜在的"清洁"替代方法:

import numpy as np
board = np.repeat('a', 6).reshape(3, 2)

答案 2 :(得分:0)

  

有没有办法改变它,使它变成......?

是的,您可以尝试使用range()内置功能:

board = [['a'] * 3 for n in range(2)]

<强>演示:

board[0][0] = 'b'
print board
>>> [['b', 'a', 'a'], ['a', 'a', 'a']]

为什么你在做什么不起作用?

因为表达式

board = [['a']*3]*2

相当于:

board = [['a', 'a', 'a']] * 2

在那里,您正在创建2列表的列表。实际上,两个列表都是相同的,都指向内存中的同一个对象。