【问题标题】:Variable resetting back to 0 after if statement in python在python中的if语句之后变量重置回0
【发布时间】:2015-09-09 22:52:50
【问题描述】:

我收到了这个错误

IndexError: 列表索引超出范围

从我收集的信息来看,这是因为我的r 变量在进入if 语句后立即重置为0。我正在学习python,所以任何提示和技巧将不胜感激。

这是我的代码

import sys
from test.test_email.test_message import first
def initMatrix(B,D,seq1,seq2,gap,match,miss): 
    r=0
    c=0
    numRows=0
    numCols=0
    temp=1
    numRows=len(seq1)+1
    numCols=len(seq2)+1
    B[0][0]= 0
    D[0][0]='0'
    for r in range(numRows):
        B[r][0]=temp*gap
        temp+=temp
        D[r][0]='V'
    temp=1
    for c in range(numCols):
        B[0][c]=temp*gap
        temp+=temp
        D[0][c]='H'
    for r in range(numRows):
        for c in range(numCols):
            if seq1[r-1]==seq2[c-1]:
                B[r][c]=match
            else:
                B[r][c]=miss
def initMatrixA(A,B,D,seq1,seq2,gap,match,miss):
    r,c=1,1
    first,second,third=0,0,0
    maxScore=0
    numRows=len(seq1)+1
    numCols=len(seq2)+1
    for r in range(numRows):
        for c in range(numCols):
            first=A[r-1][c-1]+B[r][c]
            second=A[r-1][c]+gap
            third=A[r][c-1]+gap
            if max(first,second,third)==first:
                maxScore=first
                D[r][c]='D'
            elif max(first,second,third)==second:
                maxScore=second
                D[r][c]='V'
            elif max(first,second,third)==third:
                maxScore=third
                D[r][c]='H'

    outputSeq(D,seq1,seq2)
def outputSeq(D,seq1,seq2):
    r=len(seq1)
    c=len(seq2)
    i=r
    aligned1=[0 for x in range (len(seq1))]
    aligned2=[0 for x in range (len(seq2))]
    print(D)
    while D[r+1][c+1]!='0':
        if D[r+1][c+1]=='D':
            print(r)
            aligned1[i]+=seq1[r]
            aligned2[i]+=seq2[c]
            r=r-1
            c=c-1
            i=i-1
        elif D[r+1][c+1]=='V':
            print(r)
            aligned1[i]+=seq[r]
            aligned2[i]+='-'
            r=r-1
            i=i-1
        elif D[r+1][c+1]=='H':
            print(r)
            aligned1[i]='-'
            aligned2[i]=seq2[c]
            c=c-1
            i=i-1
        else: 
            r=r-1
            c=c-1
    output=open('output.a2m','w')
    output.write(">Seq1"+seq1+"\n>Seq2"+seq2)
    output.close()

if __name__ == '__main__':
    #fasta=sys.argv[1]
    fasta=open('hw_input.fa','r')
    fasta.readline().strip()
    seq=fasta.read()
    seq1=""
    seq2=""
    s=""
    j=""
    i=0
    k=1
    gap=-2

    match,miss=1,-1
    with open('hw_input.fa','r') as fasta:
        for line in fasta:
            if ">Seq 2" in line or i==1:
                j=line
                seq2+=j
                i=1


            elif i!=1:
                s=line
                seq1+=s



    seq1=seq1.split('\n',1)[-1]
    print (">Seq1\n"+seq1)
    seq2=seq2.split('\n',1)[-1]
    print (">Seq2\n"+seq2)
    A=[[0 for x in range(len(seq1)+10)] for x in range (len(seq2)+10)]
    B=[[0 for x in range(len(seq1)+10)] for x in range (len(seq2)+10)]
    D=[[0 for x in range(len(seq1)+10)] for x in range (len(seq2)+10)]
    initMatrix(B, D, seq1, seq2, gap, match, miss)
    initMatrixA(A,B,D,seq2,seq2,gap,match,miss)
    fasta.close()
    pass

附言我正在尝试实现 Needleman-Wunchst 全局对齐算法。

【问题讨论】:

  • 您可以删除 initMatrix 的前 4 行,它们将值分配给随后在您使用变量之前被覆盖的变量。 (例如,您设置了r=0,但在将r 用作for 语句中的循环索引之前,切勿再次使用它。)
  • 究竟哪一行会引发错误?您有很多不同的变量,名为 r

标签: python variables genetics


【解决方案1】:
r-=r
c-=c
i-=i

我不知道你打算在这里做什么,但这不可能。这些赋值相当于:

r = r - r
c = c - c
i = i - i

从变量本身减去变量总是会得到 0。你不妨这样写:

r = 0
c = 0
i = 0

也许您的意思是从每个中减去 1。那是:

r -= 1
c -= 1
i -= 1

【讨论】:

  • 是的,我真是太傻了。但无论如何都会出现同样的错误
猜你喜欢
  • 2016-04-02
  • 2011-10-01
  • 2016-08-17
  • 2020-04-16
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2014-05-01
相关资源
最近更新 更多