Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UnboundLocalError:局部变量';第'行;分配前参考_Python - Fatal编程技术网

Python UnboundLocalError:局部变量';第'行;分配前参考

Python UnboundLocalError:局部变量';第'行;分配前参考,python,Python,我编写了一个函数,它计算两个给定字符串之间的Levenshtein距离。读取包含一定数量字符串的两个文件,调用函数并计算它们之间的距离。运行程序,计算并打印所有距离。但是,一旦到达终点,就会出现错误 这是我写的一段代码: def MyLevenshtein(String1, String2): rows = len(String1) + 1 columns = len(String2) + 1 distance = [[0 for x in range(columns)]

我编写了一个函数,它计算两个给定字符串之间的Levenshtein距离。读取包含一定数量字符串的两个文件,调用函数并计算它们之间的距离。运行程序,计算并打印所有距离。但是,一旦到达终点,就会出现错误

这是我写的一段代码:

def MyLevenshtein(String1, String2):
    rows = len(String1) + 1
    columns = len(String2) + 1
    distance = [[0 for x in range(columns)] for x in range(rows)]
    for i in range(1, rows):
        distance[i][0] = i
    for i in range(1, columns):
        distance[0][i] = i
    for column in range(1, columns):
        for row in range(1, rows):
            if String1[row - 1] == String2[column - 1]:
                cost = 0
            else:
                cost = 2
            distance[row][column] = min(distance[row - 1][column] + 1,  # deletion
                                 distance[row][column - 1] + 1,  # insertion
                                 distance[row - 1][column - 1] + cost) #substitution

    Distance = distance[row][column]
    return  Distance
source = open('D:/TestWords.txt', 'r', encoding="utf-8")
target = open('D:/RefWords.txt', 'r', encoding="utf-8")
source = source.read().splitlines()
target = target.read().splitlines()
for i in source:
    for j in target:
        print(i, j, MyLevenshtein(i, j))
这是出现的错误:

UnboundLocalError: local variable 'row' referenced before assignment

变量由内部for循环初始化,但随后在外部访问。引述:

for循环对目标列表中的变量进行赋值。 循环启动时,不会删除目标列表中的[…]名称 已完成,但如果序列为空,则它们将不会被删除 完全由循环指定给


虽然
变量可以在for循环外的块中使用,但它只能在循环有一些迭代时使用(另请参见)

一般来说,您是在语句中定义/创建行,该语句可能运行,也可能不运行(取决于循环条件)但无论如何,你都在试图读取它的值

你在让我们猜测错误在哪里。请编辑问题以包含完整的错误回溯消息。比较所有字符串后,错误将显示在程序末尾。程序末尾为
print(i,j,MyLevenshtein(i,j))
<代码>行不出现在该代码行中,因此错误所在的位置不能出现。没有“外部”范围;这只是一个问题,当前范围内是否发生过对
的赋值。好吧,我删除了我的答案,因为事实证明-我错了,所以我不想在这里搞砸:)谢谢巴拉克Itkin@chepner-这主要是语义上的差异,不会改变本答案中提供的信息。我认为<<代码> 循环是它自己的范围,但我也可以看到为什么你会认为它是当前范围的一部分。当你真正的意思是“block”时,使用“scope”一词并不能让事情变得更清楚。将“scope”改为“block”如何更改它以使其不改变结果?只需将有问题的行缩进两次,使其位于内部
for
循环中。这将解决您眼前的问题-可能需要一些额外的工作来计算最终结果,尽管。。。但这已经超出了你最初的问题