python 用list of lists表示矩阵的问题?
程序员文章站
2022-04-09 11:14:33
...
题主刷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]]
会是我想要的答案。
但是不知道第一种初始化方式错在哪里...
解决的方案是使用列表推导。
详细你可以看看书。(不好意思手机码字懒得写太多了,希望能解决你的问题。) 刷leetcode用python坑多啊,昨天刚遇到一个python的除法和余数机制和c不一样啊
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不一样啊
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论