Python:局部变量的UnboundLocalError

时间:2014-08-19 10:27:15

标签: python variables

我有以下代码:

import fileinput
import sys
import re

def reading_fasta(fasta):
    #### defining variables
    name = ""
    hashseq = {}
    sequence = ""
    ### loop over file
    for line in fileinput.input(fasta):
        if not line:
            hashseq[name] = sequence
            fileinput.close()
            break
        elif re.match("^>.*", line):
            if fileinput.lineno() != 1:
                hashseq[name] = sequence
                del sequence
            name = re.split('\W+', line)[1]
        else:
            line.rstrip("\n")
            sequence += line

reading_fasta(sys.argv[1])

出现以下错误:

Traceback (most recent call last):
  File "parse.py", line 25, in <module>
    reading_fasta(sys.argv[1])
  File "parse.py", line 23, in reading_fasta
    sequence += line
UnboundLocalError: local variable 'sequence' referenced before assignment

为什么?在网上冲浪我发现了相同的错误,但由于变量是在全球环境中设置的。尽管如此,我的变量在函数内部定义为局部变量。

1 个答案:

答案 0 :(得分:1)

删除变量;这取消了这个名字。

del sequence

不要那样做;将其重新绑定为空字符串,可能是:

sequence = ''

请注意,首先在列表中收集字符串,然后与str.join()一起连接,效率更高:

def reading_fasta(fasta):
    hashseq = {}
    with open(fasta) as inf:
        sequence = []
        name = ''
        for line in inf:
            if re.match("^>.*", line):
                if sequence:
                    hashseq[name] = ''.join(sequence)
                    sequence = []
                name = re.split('\W+', line)[1]
            else:
                sequence.append(line.rstrip('\n'))
        if sequence:
            # remainder
            hashseq[name] = ''.join(sequence)
    return hashseq

我已经重新编写了一些代码,以便将输入文件对象用作上下文管理器(因此它会自动关闭)。循环文件对象永远不会产生完全空行,检测完文件的最佳方法是在循环完成后处理余数。您根本无需使用fileinput.input(),因为您只需测试sequence是否为空。

我还假设你想返回结果字典。 : - )