首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当代码仍然有效时,列出超出范围的索引?

当代码仍然有效时,列出超出范围的索引?
EN

Stack Overflow用户
提问于 2020-06-18 13:32:36
回答 2查看 40关注 0票数 0

我对python比较陌生,我一直在研究一种涉及遗传代码的算法。我首先把所有的4个遗传基础,A,C,T,G与一个列表联系起来。A为1 00.0。C为0,1,0。T是0,0,1,0,G是0,0,0,1。有两个不同的遗传密码,一个是原始的,另一个是遗传变异的。该算法将根据两种遗传密码的不同,得出所给数据的结论。但首先,我需要对数据进行预处理,然后才能对算法做出结论。

到目前为止,代码看起来如下:

代码语言:javascript
复制
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相当陌生,所以我可能会忽略一些小的东西。任何帮助都是非常感谢的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-18 13:38:03

这是因为finaloriginal指向内存中相同的位置。因此,当您在这一行代码中向final插入值时:

代码语言:javascript
复制
final.insert(i, 1)

. original变量也得到了反映,最后在copy中的i第四个位置没有值:

代码语言:javascript
复制
if v == copy[i]:

溶液

您已经创建了一个列表的副本:

代码语言:javascript
复制
final = original[:]
# or: final = original.copy()
票数 3
EN

Stack Overflow用户

发布于 2020-06-18 13:41:23

造成这一问题的根本原因是这一行:

代码语言:javascript
复制
final = original

您可能会认为final是一个新列表,它包含与original相同的值。但事实上,它指的是同样的清单。

在这个循环中,

代码语言:javascript
复制
for i, v in enumerate(original):
        # ...
        final.insert(i, 1)

您不仅修改了final列表,而且因为它实际上是相同的列表,所以也修改了original。因此,对original上的迭代进行扩展,导致i的值大于允许作为copy列表索引的值(最初的索引大小与original相同)。

因此,您将得到行if v == copy[i]的错误“超出范围的列表索引”,这实际上意味着ilen(copy) - 1大。

为了避免此错误,您需要创建final作为original的实际副本,您可以通过

代码语言:javascript
复制
final = original[:]

代码语言:javascript
复制
final = list(original)

有关更多选项,请参见How to clone or copy a list?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62451185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档