【采坑】Python的数组初始化
今天在写维特比算法计算带权路径图的最短路径时候,用到了list这个python中的变量类型。
这里是根据给定的逆邻接表用动态规划算法中的维特比算法来计算一个最短路径的list
在下面的代码片段中调用calc_min_weight_path_back
方法可以求出给定的逆邻接表的最短路径数组
1 | def get_total_weight(list_input, index): |
代码片段中的tmp_min_list
变量,我需要预先初始化成为如下的一个二维数组
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
0 | None | None | None | None | None | None | None |
1 | None | None | None | None | None | None | None |
于是我使用了``这种方法
In[1]:[[None, None]] * 8
Out[1]:
[[None, None],
[None, None],
[None, None],
[None, None],
[None, None],
[None, None],
[None, None],
[None, None]]
乍一看上去没有问题。。然后我就放心的写入了函数
运行时候出现了RuntimeError: maximum recursion depth exceeded in comparison
的问题
查询了一下发现是递归超出限度的深度。。结果我以为是递归哪里写错了。。然后一个劲儿的查找递归的问题
找到最后还是找不到。。于是使用最著名的debug大法:print
结果发现我循环到第二次输出的数据竟然是出了0号位置设置了其他值以外剩下的7位都一样。。
这下我才想起来很久很久之前好像听过这个问题。。但是一直觉得python是一种特别随意的语言。。所以就没有注意。。
好了回归正题。。
这次特意从网路上找来了一些资料。。总结在这里。。
免得我下次再次遇到这种问题时候又不知道该怎么办hhhhhh
对于元素值没有要求的初始化可以使用如下代码
1 | list_result = list(range(x)) |
这样的输出结果会是
1 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
如果初始化成为相同的内容可以使用*来解决,如:
1 | list_result = [0]*10 |
其输出结果为
1 | [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] |
或者还可以使用内联的方式
1 | list_result = [-1 for _ in range(10)] |
输出结果为
1 | [1, -1, -1, -1, -1, -1, -1, -1, -1, -1] |
对于一个二维数组
可以先用上述方法生成行,再对每一行进行生成,即
1 | list_list_result = [[-1 for _ in range(10)] for _ in range(10)] |
其输出结果为
1 | [[1, -1, -1, -1, -1, -1, -1, -1, -1, -1], |
当然上面的这些内容也可以使用numpy去解决。。但是我暂时不想写了。。记录到这里就完了
参考链接
【Python递归报错:RuntimeError: maximum recursion depth exceeded in comparison】:https://www.cnblogs.com/zhanxueyou/p/3799410.html
【python初始化list列表(1维、2维)】:https://www.cnblogs.com/zqifa/p/python-list.html
在服务器中住着的AKI娘会检测您的输入内容哦, 如果被判断为垃圾内容是看不到的呢!当然抹茶也会定期检查AKI娘的所作所为的!