外部函数中定义的局部变量在内部函数中不起作用?

时间:2017-04-28 09:56:31

标签: python

我在函数中定义了一个变量,我想在外部函数中定义的内部函数中使用这个变量。但是,有一个错误:在赋值之前引用此变量。我不知道为什么。

class Solution(object):
    def findItinerary(self, tickets):
        """
        :type tickets: List[List[str]]
        :rtype: List[str]
        """
        length = len(tickets)
        visit = [1 for i in range(length)]
        tmp = []
        result = []

        def dfs(tickets, ticket):
            if len(tmp) == length:
                tmp.append(ticket[1])
                if len(result) == 0 or (result != [] and result[1:] > tmp[1:]):
                   result = tmp
                tmp.pop()
                return
            for i in range(length):
                if visit[i] == 1 and ticket[1] == tickets[i][0]:
                    tmp.append(ticket[1])
                    visit[i] = 0
                    dfs(tickets, tickets[i])
                    visit[i] = 1
                    tmp.pop()

        for count in range(length):
            if tickets[count][0] == "JFK":
                visit[count] = 0
                tmp.append(tickets[count][0])
                dfs(tickets, tickets[count])
                tmp.pop()
                visit[count] = 1
        return result

“结果”是变量。错误是这样的:

UnboundLocalError: local variable 'result' referenced before assignment

如果我替换

result = tmp

del result[:]
result.extend(tmp)

然后它有效。而我对此非常困惑。

1 个答案:

答案 0 :(得分:0)

通过设置exact: true,你告诉python它是一个局部变量,它将在最里面的范围内定义。如果您使用的是python3,则可以使用result将相同的变量用作外部范围。在python2中,这个变量是必读的“只读”,你不能在内部范围内分配它。

From the documentation

  

Python的一个特殊之处在于 - 如果没有全局语句生效 - 对名称的赋值总是进入最内层范围。分配不复制数据 - 它们只是将名称绑定到对象。删除也是如此:语句del x删除了x与本地范围引用的命名空间的绑定。实际上,引入新名称的所有操作都使用本地作用域:特别是,import语句和函数定义绑定本地作用域中的模块或函数名称。

     

全局声明可用于表明特定变量存在于全局范围内,应该在那里反弹;非本地语句表明特定变量存在于封闭范围内,应该在那里反弹。