Python:为局部变量取消绑定LocalError
我有以下代码:Python:为局部变量取消绑定LocalError,python,variables,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: hash
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
回溯(最近一次呼叫最后一次):
文件“parse.py”,第25行,在
正在读取\u fasta(sys.argv[1])
文件“parse.py”,第23行,在reading_fasta中
序列+=行
UnboundLocalError:赋值前引用的局部变量“序列”
为什么呢?在网上冲浪时,我发现了同样的错误,但因为变量是在全局环境中设置的。尽管如此,我的变量在函数中定义为局部变量。在某个点删除变量;这就解开了名字的束缚
del sequence
不要那样做;将其重新绑定到空字符串,可能是:
sequence = ''
请注意,首先在列表中收集字符串,然后使用str.join()
一次性连接,这样更有效:
我对您的代码做了一些修改,将输入文件对象用作上下文管理器(因此它会自动关闭)。在file对象上循环永远不会产生完全的空行,检测文件是否已完成的最佳方法是在循环完成后处理剩余的行。您根本不需要在此处使用fileinput.input()
,因为您可以简单地测试sequence
是否不是空的
我还假设您希望返回生成的词典。:-) 一件小事竟能浪费我这么多时间,真是太神奇了。。。谢谢!
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