Python属性值

时间:2016-03-21 12:55:04

标签: python attributes

我有以下Python代码:

#!/usr/bin/python

def f(x):
    f.counter = getattr(f, "counter", 0)
    print("Bfore: ",f.counter)
    f.counter += 1
    print("After: ",f.counter)
    return "pass"


for i in range(5):
    f(i)

当我运行上面的代码时,我看到以下结果:

('Bfore: ', 0)
('After: ', 1)
('Bfore: ', 1)
('After: ', 2)
('Bfore: ', 2)
('After: ', 3)
('Bfore: ', 3)
('After: ', 4)
('Bfore: ', 4)
('After: ', 5)

我在期待:

f.counter = getattr(f, "counter", 0)

每次调用时始终初始化为零:

f(i) 

在我的

for

环。但事实似乎并非如此。为什么呢?

感谢。

3 个答案:

答案 0 :(得分:1)

f.counter = getattr(f, "counter", 0)只会在不存在的情况下将其设置为零。如果要在每次调用时将其设置为零,请直接设置它:

f.counter = 0

答案 1 :(得分:0)

f总是引用相同的函数对象。

f.counter = getattr(f, "counter", 0)f.counter的值设置为当前值f.counter或0(如果该属性不存在)。

答案 2 :(得分:0)

请记住,在python中,一切都是对象。因此,在执行def f(...)时,您只需创建一个函数的新实例。您可以输入以下内容来说服自己:

def f(foo):
    print foo

type(f)  # return <type 'function'>

此处f已在第一行实例化。因此,在您的示例中,您始终使用相同的f实例。在第一次通话时,您会为其添加counter属性。在第二次和下一次调用时,您仍在使用相同的实例,因此counter属性仍然存在。