在不使用“global”的情况下访问函数外部的函数变量

时间:2013-10-11 19:43:10

标签: python local-variables

我试图在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的情况下访问其函数(hi())之外的本地函数变量(sigh)? (在下面的@hcwhsa评论之后编辑了问题以包括sigh

5 个答案:

答案 0 :(得分:66)

你可以沿着这条线做点什么(当我测试它/它们时,它在Python v2.7.15和v3.7.1中都有效):

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

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

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

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

这个附加参数将为函数提供一种引用自身的方法,而不需要将它显式嵌入(硬编码)到它们的定义中,并且类似于类方法自动接收的实例参数作为它们的第一个参数,通常命名为{{1}我选择了一些不同的东西来避免混淆,但是就像self参数一样,它可以根据你的意愿命名。

以下是该方法的一个示例:

self

答案 1 :(得分:8)

问题是在将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']

更多关于http://docs.python.org/2/tutorial/datastructures.html#dictionaries

的python词典

答案 2 :(得分:1)

 def hi():
     bye = 5
     return bye  

print hi()

答案 3 :(得分:0)

你可以这样做:

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()

答案 4 :(得分:0)

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

coalesce()

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