在下面的代码中,我定义了一个具有变量y的函数f
。
我试图在函数外调用f.y并抛出错误。
但它允许我分配f.y=11
甚至新属性f.x=12
。但是调用f()不会更新y
。那么f.y
或f.x
附加到哪里。是否可以更改函数内的y
。
>>> def f():
... y = 10
... print y
...
>>> f.y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'y'
>>> f.y = 11
>>> f()
10
编辑:这也无济于事
>>> def f():
... f.y = 10
... print f.y
...
>>> f()
10
>>> f.y=11
>>> f()
10
>>
答案 0 :(得分:4)
如果你解释了你想要完成的事情,也许会更好。首先直接回答你的问题:
f
指的是您创建的function
对象。您可以将属性分配给具有__dict__
属性的任何对象(即您使用f.y=11
执行的操作)。继续查看dir(f)
,您会看到它有一个__dict__
。它本质上是一个围绕普通dict
的语法包装器,通常可以通过执行类似
my_dict['y'] = 10
请注意,此dict
nothing 与您在函数中定义的任何本地人有关。通常,您根本不想这样做,而是在需要dict
时支持明确的dict
。您希望使用此语法访问对象的__dict__
:类时的情况。我将在下面简要介绍一下。
现在,既然我认为你正试图在这里重新发明轮子,我会尝试重新审视你应该做什么。由于我不知道你要做什么,我会使用霰弹枪的方法并覆盖我能想到的数量。
- 将其作为函数的参数,或者更好,将其作为默认参数提供给f,您可以选择更改它。
def f(y=10):
print y
f()
#prints 10
f(y=11)
#prints 11
- 从f
返回您的值。这当然可以让您访问变量。基本的东西,但.. ..
def f(y=10):
return y
f()
Out[9]: 10
f(y=11)
Out[10]: 11
- 使f
成为class
。这允许您使用f
的实例并根据需要对其进行操作。
class F:
def __init__(self,y=10):
self.y = y
f1 = F()
f2 = F(y=11)
f1.y, f2.y
Out[17]: (10, 11)
- 最后,全局变量。不要使用全局变量。
答案 1 :(得分:1)
在f()
中,请参阅y
,而不是引用f.y
。
答案 2 :(得分:1)
您可以将y
设置为全局变量,并将其作为global y
在函数内部调用。
答案 3 :(得分:0)
在Python中,一切都是object
。甚至您定义的函数f
也是object
。
当您说f.y = 11
时,您正在为对象y
分配名为f
的属性。但是,这与您在函数内定义的局部变量y = 10
完全不同。
要检查对象,您可以使用dir
功能:dir(f)
。
答案 4 :(得分:0)
y是函数中的局部变量,通过调用f.y = 11在函数对象中创建一个新变量(按dir(f)
来查看),它不会改变局部变量y值。
如果您想要更改变量,可以使用此
def f(val):
y = val
print y
或使y成为全局变量
y = 10
def f():
print y