今天在码Python代码时遇到了一个很有意思的问题:索引溢出。
原代码:
# 2行4列的二维数组
lst = [[True, True, True, True], [True, False, False, False]]
print(lst[1][0]) # True,输出第2行第1列的元素
start_row = 2 # 当前行
rows = 2 # 需要增加的行
for i in range(start_row, start_row + rows):
if lst[i] is None:
lst[i] = [False, False, False, False]
print(lst)
"""
按照我的思路,代码执行完后,应该输出
[[True, True, True, True],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False]]
但事与愿违,代码报错:IndexError: list index out of range
"""
原因分析:
"""
上段代码中的第7行:lst[i]
在Python中使用索引获取列表元素时,若索引超过len(list),底层就会报错IndexError
这段代码的思路是我之前封装form表单时使用的。在JavaScript中使用索引获取数组元素时,
若索引超过list.length,则返回null,这段代码可以完美运行
"""
问题解决:
"""
方法1: try:...except:...
"""
# 2行4列的二维数组
lst = [[True, True, True, True], [True, False, False, False]]
print(lst[1][0]) # True,输出第2行第1列的元素
start_row = 2 # 当前行
rows = 2 # 需要增加的行
for i in range(start_row, start_row + rows):
try:
if lst[i] is None:
lst[i] = [False, False, False, False]
except IndexError:
lst.insert(i, [False, False, False, False])
print(lst)
"""
方法2: 先判断是否超出,再获取元素
"""
# 2行4列的二维数组
lst = [[True, True, True, True], [True, False, False, False]]
print(lst[1][0]) # True,输出第2行第1列的元素
start_row = 2 # 当前行
rows = 2 # 需要增加的行
for i in range(start_row, start_row + rows):
if i >= len(lst):
lst.insert(i, [False, False, False, False])
print(lst)
结语:
感觉还是Js那种直接一点,还有没有其他方法可以避免IndexError,欢迎交流。
顺便吐槽一下,两种语言在同一问题上进行了不同的处理,全是坑,哈哈。