Python 尝试在一个位置更改时,在列表的多个位置更改值

Python 尝试在一个位置更改时,在列表的多个位置更改值,python,matrix,Python,Matrix,python中的以下代码: matrix = [[0]*3]*2 matrix[0][1] = 1 如需更改所有矩阵[][1]第个位置的值,矩阵变为 [[0,1,0],[0,1,0]]而不是[[0,1,0],[0,0,0]] 这是如何初始化变量的问题,还是python中的默认行为 另外,如何一次只更改一个值。关于乘法运算符*如何在python中的列表上工作,有一些微妙之处 更一般地说,当应用于不可变对象(如整数或字符串)时,它的效果不同,当应用于可变对象(如列表和字典)时,它的效果也不同 这可

python中的以下代码:

matrix = [[0]*3]*2
matrix[0][1] = 1
如需更改所有
矩阵[][1]
第个位置的值,矩阵变为
[[0,1,0],[0,1,0]]
而不是
[[0,1,0],[0,0,0]]

这是如何初始化变量的问题,还是python中的默认行为


另外,如何一次只更改一个值。

关于乘法运算符
*
如何在python中的列表上工作,有一些微妙之处

更一般地说,当应用于不可变对象(如整数或字符串)时,它的效果不同,当应用于可变对象(如列表和字典)时,它的效果也不同

这可能会澄清这个问题:

>>> l = [0] * 3  #a list of immutable integers
>>> l
[0, 0, 0]
>>> l[0] = 1
>>> l
[1, 0, 0]
>>> l = [[0]] * 3  #a list of mutable lists
>>> l
[[0], [0], [0]]
>>> l[0][0] = 1
>>> l
[[1], [1], [1]]
EDIT(在评论中对@lazyr表示敬意)在这两种情况下,
*
操作符都会创建一个具有相同标识(内存地址)的对象列表,因此数组中的每个数字(和每个列表)实际上都是相同的对象,但是,不可变类型不能修改,只能替换,因此,当您尝试为整数数组指定一个新值时,您将实际替换整个对象,而列表则不是这样。基于上一个示例(请记住,函数返回对象的内存地址):

因此,在您的情况下,一个可能的解决方法是如下初始化矩阵:

>>> matrix = [[0 for i in range(3)] for j in range(2)]
>>> matrix
[[0, 0, 0], [0, 0, 0]]
>>> matrix[0][2] = 1
>>> matrix
[[0, 1, 0], [0, 0, 0]]
另一种更激进的方法是完全切换到,这种方法速度更快,而且可以从头开始进行极快的矩阵和多维向量操作,但也更难使用

试试看:

matrix = [[0]*3 for j in xrange(2)]

我明白了。。谢谢你,麦克!!这是一种糟糕的初始化列表的方法,请阅读一些python注释,解释python中的矩阵。很好的解释。比我的尝试好多了;)正如我所理解的,事实上,*对可变类型和不可变类型的操作方式没有区别。在这两种情况下,它都会创建具有相同标识(内存地址)的对象列表。不同之处在于以后发生的修改:不可变类型不能修改,只能替换,因此您只能在可变类型上看到这种效果。如果您知道要使用什么,这是初始化列表的好方法。有时,在列表中对同一对象有多个引用正是您想要的(至少从一开始)。
matrix = [[0]*3 for j in xrange(2)]