1

在下面的代码中,我定义了一个f具有变量 y 的函数。我试图在函数外部调用 fy 并引发错误。但它允许我分配f.y=11甚至新的属性f.x=12。但调用 f() 不会更新y. 那么这个f.yf.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
>>
4

5 回答 5

4

如果您解释一下您要完成的工作,也许会更好。首先直接回答你的问题:

ffunction您创建的对象。您可以将属性分配给任何具有__dict__属性的对象(即您正在使用的对象f.y=11)。去看看吧dir(f),你会发现它有一个__dict__. 它本质上是一个围绕法线的语法包装器dict,您通常可以通过执行类似的操作来访问它

my_dict['y'] = 10

请注意,这与您在函数中定义的任何局部变量无关dict。通常,您根本不想这样做,而是在需要. 当您确实想使用此语法访问对象的: 类时的情况。我将在下面简要介绍。dictdict__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)

-最后,全局变量。不要使用全局变量。

于 2013-10-24T22:55:00.397 回答
1

您可以将其设置y为全局变量并在函数内部将其调用为global y.

于 2013-10-24T22:45:21.017 回答
1

f(),而不是指y,指f.y

于 2013-10-24T22:30:27.140 回答
0

在 Python 中,一切都是object. 甚至f您定义的函数也是object.

当您说时f.y = 11,您正在分配一个称为y对象的属性fy = 10但是,这与您在函数内部定义的局部变量完全不同。

要检查对象,您可以使用以下dir功能:dir(f).

于 2013-10-24T22:33:37.963 回答
0

y 是函数中的局部变量,通过调用 fy = 11 在函数对象中创建一个新变量(按此dir(f)查看)它不会更改局部变量 y 的值。

如果你想让你的变量改变你可以使用这个

def f(val):
  y = val
  print y

或者让你成为全局变量

y = 10

def f():
  print y
于 2013-10-24T22:39:09.027 回答