我有以下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
环。但事实似乎并非如此。为什么呢?
感谢。
答案 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
属性仍然存在。