python对二维数组赋值问题
作者:study_&
这篇文章主要介绍了python对二维数组赋值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
python对二维数组赋值
最近做力扣遇到一个问题,
obstacleGrid=[[0],[1]] m = len(obstacleGrid) n = len(obstacleGrid[0]) # 需要考虑m=1 n=1 dp = [[0] * n] * m
但是当写dp[0][0]=1时,dp[1][0]也会自动变1,理由
定义的时候dp的m行是同一个[0]*n的索引,所以一个被改变,其他的都被改变。
靠谱点的初始化方式
dp = [[0 for _ in range(n)] for _ in range(m)]
或者深拷贝
import copy dp = [] a = [0]*n for i in range(m): dp.append(copy.deepcopy(a))
python创建二维数组的不同方式以及整列赋值的问题
会出现整列赋值的创建方式
在C中输入二维数组形式非常熟悉(采用codeblocks):输入一行的数字,每个之间空格隔开,回车继续输下一行
在python中采用同样的形式输入(采用PyCharm):
代码如下:
输入:
其中输入3->回车,输入4->回车,表示构建了一个A[4][3]的矩阵。
输入1 2 3->回车,输入4 5 6->回车,输入7 8 9->回车,输入0 1 2->回车
输出:
这样创建二维列表在后续的使用中遇到了问题。
比如我的本意是把第二行第二个元素赋值为1,而输出如下
他将我每一行的第二列都赋值为了1,原因是因为我的二维列表创建方式导致了[[]]*4表示的是4个同时指向一个列表的引用,也就是4行都指向的是同一个列表,改变任意一个都会改变每一行的当列数据。
避免浅拷贝的创建方式
可以知道,上图的两种创建方式都可以避免浅拷贝,总结来说只要对于行不要使用*M这种写法,都可以避免。
第一种创建方式可以在创建时就固定二维列表的行和列。
第二种创建方式可以初始只能固定行数,每一行的数据可以在后续append进去。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。