board = [['a']*3]*2
board[0][0] = 'b'
...然后board
变为[['b','a','a'],['b','a','a']]
有没有办法改变它,使它变成......?
[['b','a','a'],['a','a','a']]?
感谢。
答案 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
的两个副本。 x
,board[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
列表的列表。实际上,两个列表都是相同的,都指向内存中的同一个对象。