我试图在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
。
答案 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。 结论:为了能够访问局部函数的变量,可以在局部变量的名称之前添加函数的名称和点(然后,当然,可以使用此构造在函数的主体内部和外部调用变量)的)。 我希望这将有所帮助。