可能很多小伙伴在写算法题的时候,,比如在写动态规划的时候,
大家默认创建多维数组的方式都是
dp = [[0]*9 for _ in range(9)]
大家这样做了很多次了,那肯定是没有毛病的
但大家有没有思考过一个问题,就是
dp = [[0]*9]*9
这样写是不是更方便一些,因为我以前没有尝试过,今天踩了个大坑,就记录一下
以第一种方式创建,复制看看会发生什么dp = [[0]*9 for _ in range(9)] dp[0][0] = 1 dp """ [[1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] """
看,我们的输出是没有问题的,的确只给dp[0][0]给赋值了
我们试试第二种创建的,进行复制,看看会发生什么dp = [[0]*9]*9 dp[0][0] = 1 dp """ [[1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0]] """
我们神奇的发现,虽然我们只给dp[0][0]赋值了,但结果是第一列都被赋值了
这里就需要解释下了
大家学过python的都知道,python的变量名与值是通过索引链接起来的
当我们用*给列表增加的时候,python内部并由进行真正的创建新的列表
而是仅仅复制了索引,所以到会导致出现这种情况,所以,大家在创建多为数组的时候就不要偷懒了,老老实实去创建


![[[0]*9 for [[0]*9 for](http://www.mshxw.com/aiimages/31/861752.png)
