我对python比较陌生,我一直在研究一种涉及遗传代码的算法。我首先把所有的4个遗传基础,A,C,T,G与一个列表联系起来。A为1 00.0。C为0,1,0。T是0,0,1,0,G是0,0,0,1。有两个不同的遗传密码,一个是原始的,另一个是遗传变异的。该算法将根据两种遗传密码的不同,得出所给数据的结论。但首先,我需要对数据进行预处理,然后才能对算法做出结论。
到目前为止,代码看起来如下:
A = [1, 0, 0, 0]
C = [0, 1, 0, 0]
T = [0, 0, 1, 0]
G = [0, 0, 0, 1]
original = [A, T, T, G, C, T, A]
copy = [C, T, T, A, T, A, A]
final = original
for i, v in enumerate(original):
if v == copy[i]:
print(v)
elif v != copy[i]:
final.insert(i, 1)
print(final)我得到的错误是“索引超出了范围”。但是,程序仍在运行,但出现了错误。首先,我是否应该担心这个问题,这是否有任何意义呢?第二,如果这是件大事,我应该如何解决这个问题?如果不是,为什么一开始就会发生呢?我还尝试过不同的代码编译器,比如google和Pycharm。

我对Python相当陌生,所以我可能会忽略一些小的东西。任何帮助都是非常感谢的!
发布于 2020-06-18 13:38:03
这是因为final和original指向内存中相同的位置。因此,当您在这一行代码中向final插入值时:
final.insert(i, 1). original变量也得到了反映,最后在copy中的i第四个位置没有值:
if v == copy[i]:溶液
您已经创建了一个列表的副本:
final = original[:]
# or: final = original.copy()发布于 2020-06-18 13:41:23
造成这一问题的根本原因是这一行:
final = original您可能会认为final是一个新列表,它包含与original相同的值。但事实上,它指的是同样的清单。
在这个循环中,
for i, v in enumerate(original):
# ...
final.insert(i, 1)您不仅修改了final列表,而且因为它实际上是相同的列表,所以也修改了original。因此,对original上的迭代进行扩展,导致i的值大于允许作为copy列表索引的值(最初的索引大小与original相同)。
因此,您将得到行if v == copy[i]的错误“超出范围的列表索引”,这实际上意味着i比len(copy) - 1大。
为了避免此错误,您需要创建final作为original的实际副本,您可以通过
final = original[:]或
final = list(original)有关更多选项,请参见How to clone or copy a list?。
https://stackoverflow.com/questions/62451185
复制相似问题