python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python对二维数组赋值

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进去。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文