62

我正在尝试在 Python 中访问函数之外的局部函数变量。所以,例如,

bye = ''
def hi():
    global bye
    something
    something
    bye = 5
    sigh = 10

hi()
print bye

以上工作正常。因为我想知道我是否可以在不使用的情况下访问bye外部,所以我尝试了:hi()global bye

def hi():
    something
    something
    bye = 5 
    sigh = 10
    return

hi()
x = hi()
print x.bye 

以上给出AttributeError: 'NoneType' object has no attribute 'bye'.

然后,我尝试了:

def hi():
    something
    something
    bye = 5
    sigh = 10
    return bye 
hi()
x = hi()
print x.bye

这次它甚至没有给出错误。

那么,有没有一种方法可以在不使用全局变量且不打印变量的情况下访问bye其函数()之外的局部函数变量( ) ?(在@hcwhsa 下面的评论之后,问题被编辑为包括在内。hi()sighsigh

4

5 回答 5

123

你可以按照这些思路做一些事情(当我测试它/它们时,它在 Python v2.7.17 和 v3.8.1 中都有效):

def hi():
    # other code...
    hi.bye = 42  # Create function attribute.
    sigh = 10

hi()
print(hi.bye)  # -> 42

函数是 Python 中的对象,可以为它们分配任意属性。

如果您要经常做这种事情,您可以通过创建一个函数装饰器来实现更通用的东西,该函数装饰器this为对装饰函数的每次调用添加一个参数。

这个额外的参数将为函数提供一种引用自身的方式,而无需将它们的名称显式嵌入(硬编码)到定义的其余部分,并且类似于类方法自动接收的实例参数作为它们通常命名的第一个参数self——我选择一些不同的东西以避免混淆,但就像self参数一样,它可以任意命名。

这是该方法的示例:

def add_this_arg(func):
    def wrapped(*args, **kwargs):
        return func(wrapped, *args, **kwargs)
    return wrapped

@add_this_arg
def hi(this, that):
    # other code...
    this.bye = 2 * that  # Create function attribute.
    sigh = 10

hi(21)
print(hi.bye)  # -> 42

笔记

这不适用于类方法。只需使用self按约定命名的实例参数,它已经传递给方法而不是方法的名称。您可以通过 引用类级属性type(self)在类中查看函数的属性。

于 2013-10-11T21:42:39.077 回答
10

问题是您在将 x 设置为字符串后调用 print x.bye 。当您运行x = hi()它时,它会运行 hi() 并将 x 的值设置为 5(bye 的值;它不会将 x 的值设置为对 bye 变量本身的引用)。EX:bye = 5; x = bye; bye = 4; print x;打印 5,而不是 4

此外,您不必运行 hi() 两次,只需运行x = hi(),而不是hi();x=hi()(按照您运行 hi() 的方式,不执行任何结果值为 5 的操作,然后重新运行相同的 hi() 和将 5 的值保存到 x 变量。

所以完整的代码应该是

def hi():
    something
    something
    bye = 5
    return bye 
x = hi()
print x

如果您想返回多个变量,一种选择是使用列表或字典,具体取决于您的需要。

前任:

def hi():
    something
    xyz = { 'bye': 7, 'foobar': 8}
    return xyz
x = hi()
print x['bye']

更多关于 python 字典的信息,请访问http://docs.python.org/2/tutorial/datastructures.html#dictionaries

于 2013-10-11T19:58:14.910 回答
3

我遇到过同样的问题。对您的问题的答复之一使我想到了以下想法(最终奏效了)。我使用 Python 3.7。

    # just an example 
    def func(): # define a function
       func.y = 4 # here y is a local variable, which I want to access; func.y defines 
                  # a method for my example function which will allow me to access 
                  # function's local variable y
       x = func.y + 8 # this is the main task for the function: what it should do
       return x

    func() # now I'm calling the function
    a = func.y # I put it's local variable into my new variable
    print(a) # and print my new variable

然后我在 Windows PowerShell 中启动该程序并得到答案 4。 结论:为了能够访问局部函数的变量,可以在局部变量的名称前添加函数名称和一个点(然后,当然,使用这种结构在函数体和函数体外部调用变量)。我希望这将有所帮助。

于 2018-07-23T15:52:58.650 回答
2

您可以按照以下方式做一些事情:

def static_example():
   if not hasattr(static_example, "static_var"):
       static_example.static_var = 0
   static_example.static_var += 1
   return static_example.static_var

print static_example()
print static_example()
print static_example()
于 2016-03-16T21:41:19.510 回答
1
 def hi():
     bye = 5
     return bye  

print hi()
于 2017-01-10T09:04:49.127 回答