Python 更改列表列表中的值
…然后Python 更改列表列表中的值,python,list,Python,List,…然后board变成[[b'、'a'、'a']、[b'、'a'、'a']] 有没有办法让它变异成 board = [['a']*3]*2 board[0][0] = 'b' 谢谢。您初始化列表的方式导致了问题 [['b','a','a'],['a','a','a']]? vs 在第一种方法中,由于您初始化它的方式,board[0]和board[1]是相同的列表。这与不以这种方式在函数中定义默认参数的原因相同: >>> board = [['a', 'a', 'a'], ['
board
变成[[b'、'a'、'a']、[b'、'a'、'a']]
有没有办法让它变异成
board = [['a']*3]*2
board[0][0] = 'b'
谢谢。您初始化列表的方式导致了问题
[['b','a','a'],['a','a','a']]?
vs
在第一种方法中,由于您初始化它的方式,board[0]
和board[1]
是相同的列表。这与不以这种方式在函数中定义默认参数的原因相同:
>>> board = [['a', 'a', 'a'], ['a', 'a', 'a']]
>>> board[0][0] = 'b'
>>> board
[['b', 'a', 'a'], ['a', 'a', 'a']]
与之相反:
def f(a, b=[]):
有没有办法让它变异成
board = [['a']*3]*2
board[0][0] = 'b'
可以,您可以尝试使用内置功能:
def f(a, b=None):
if b = None:
b = []
演示:
board = [['a'] * 3 for n in range(2)]
为什么你所做的不起作用?
因为表情
board[0][0] = 'b'
print board
>>> [['b', 'a', 'a'], ['a', 'a', 'a']]
相当于:
board = [['a']*3]*2
在那里,您正在创建一个
2
列表的列表。事实上,两个列表都是相同的,都引用了内存中的同一个对象。您的代码相当于以下内容:
board = [['a', 'a', 'a']] * 2
board
只是x
的两个副本x
、board[0]
和board[1]
都引用同一个python对象,对这三个列表中的任何一个所做的修改实际上都是对同一基础列表的修改
试一试
编辑:如果您想使用numpy,这可能是一个“更干净”的替代方案:
board = [['a'] * 3 for i in range(2)]
+1对于numpy的建议。如果您正在为这样的电路板使用2D阵列,几乎肯定值得考虑。
board = [['a'] * 3 for i in range(2)]
import numpy as np
board = np.repeat('a', 6).reshape(3, 2)