Python辅助函数范围

时间:2015-01-27 21:04:01

标签: python function scope local-variables

所以,我有很多事情做的基本相同,只是输入稍有变化。完美的候选者可以使用不同的参数进行功能调用和调用,对吗?

显然,python认为我错了。

所以,这是我的问题的简化版本

def main():
    x = 10

    def helper(n):
      if (x > n):
          x -= n

辅助函数中还有许多其他行,在main中它被称为几十行,但这些是导致我出问题的行。我知道帮助函数是使用局部范围而不是使用main中的一个,但我的问题是,为什么?以及如何修复它?

我不想让x全局,我只是希望帮助者使用已经存在的x而不是自己编写。如果没有这个辅助函数,代码行总数至少会翻两番,并且代码将是一个令人费解的,难以理解的混乱。

编辑:另外,Main使用x一大堆,所以我不能在本地定义它,如果不清楚的话。

2 个答案:

答案 0 :(得分:2)

在Python 3中,您可以通过将nonlocal x放在内部函数中来完成此操作。在Python 2中你无法做到。

但是,您可以执行的操作是从辅助函数返回值,并将其分配给您调用辅助函数的位置。从你的例子中说出来有点难,但我假设你正在使用这样的东西:

def main():
    x = 10

    def helper(n):
        if (x > n):
            x -= n

    # do something that changes x
    helper(2)
    # now x has changed

相反,这样做:

def helper(x, n):
    if (x > n):
        return x - n
    else:
        return x

def main():
    x = 10

    # do something that changes x
    x = helper(x, 2)
    # now x has changed

我们的想法是将辅助函数传递给它所需的值,并让它返回结果值,然后您可以在调用帮助程序的位置分配(或执行您喜欢的操作)。这通常使代码更容易遵循,而不是让辅助函数直接修改其调用者中的变量。另请注意,您可以在helper之外定义main,在两者之间创建更清晰的分隔,并使helper可用于其他功能。

答案 1 :(得分:1)

问题在于:x -= n。由于你正在进行扩充赋值,python认为(错误地)x是局部变量。不幸的是,x是一个“非本地”变量。在python3.x上,如果您可以在x范围内修改main,则可以使用nonlocal关键字。但是,我猜您不想修改x范围内的main。一个跨版本的技巧是让自己获得一个与非本地版本具有相同值的局部变量:

def main():
    x = 10
    def helper(n):
        lx = x
        if x > n:
           lx -= n
        # etc., etc.

    helper(12)  # ...

如果你真的想在x的范围内改变main,你可能想要考虑一个类(helper类的方法):

class Main(object):  # Main for lack of a better name...
    def __init__(self, x):
        self.x = x
    def helper(self, n):
        if self.x > n:
            self.x -= n

def main():
    x = Main(10)
    ...
    x.helper(12)
    ...