好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python用listoflists表示矩阵的问题?

题主刷leetCode的时候发现的一个小情况>_
python 初始化 a list of lists of integer,就用了如下方式(假设是4 x 4的方阵):
n = 4
matrix = [[0]*n]*n
print matrix
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
然后诡异的是,假如我只想给第二行的中间两个元素赋值:
matrix[1][1:3] = [1, 2]
结果会是:
print matrix
[[0, 1, 2, 0], [0, 1, 2, 0], [0, 1, 2, 0], [0, 1, 2, 0]]

但是如果用如下方式初始化matrix:
matrix = [[0 for col in range(n)] for row in range(n)]
matrix[1][1:3] = [1, 2]
print matrix
[[0, 0, 0, 0], [0, 1, 2, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
会是我想要的答案。

但是不知道第一种初始化方式错在哪里...

回复内容:

 matrix = [[0]*n]*n
  

  #!/usr/bin/python 
 #encoding=utf-8 

 # 内容来自python cookbook 第二版 第4.5章节 
 # 在无须共享引用的条件下创建列表的列表 
 # 避免隐式的引用共享 

 multi   =   [   [  0  ]   *   5   ]   *   3  
 print   multi  
 multi  [  0  ][  0  ]   =   'oops' 
 print   multi 
 # [ [ 'oops', 0, 0, 0, 0 ],[ 'oops', 0, 0, 0, 0],[ 'oops', 0, 0, 0, 0 ] ]  

 # 等价方式 
 row   =   [  0  ]   *   5   # row 列表中的5个子项都是引用0 
 multi   =   row   *   3   # multi 列表中的3个子项都是引用row 
 # 解释: 在row创建中, 有无引用被复制完全不重要, 因为被引用的 
 # 是数字, 而数字不可改变,换句话说,如果对象是不可改变的,则 
 # 对象和对对象的引用实际没有区别。 
 # multi创建中,包含了3个对[row] 内容引用,而其内容则是对一个 
 # 列表的引用。因此修改时候其他3个引用也改变了,甚至row也改变 

 # 解决方法: 
 multilist_method1   =   [   [   0   for   col   in   range  (  5  )   ]   for   row   in   range  (  3  )   ] 
 multilist_method2   =   [   [  0  ]   *   5   for   row   in   range  (  3  )   ] 
 multilist_method1  [  0  ][  0  ]   =   'abc' 
 multilist_method2  [  0  ][  0  ]   =   'edf' 
 print   multilist_method1 
 print   multilist_method2 
  
赞同楼上,另外要处理矩阵相关的话用 NumPy 第一种是浅拷贝 这个问题,在《Python cookbook》第二版p148页提到,即隐式的引用共享问题。
解决的方案是使用列表推导。
详细你可以看看书。(不好意思手机码字懒得写太多了,希望能解决你的问题。) 刷leetcode用python坑多啊,昨天刚遇到一个python的除法和余数机制和c不一样啊

查看更多关于python用listoflists表示矩阵的问题?的详细内容...

  阅读:41次