我想使用函数属性将变量值设置为使用全局变量的替代值。但有时我会为函数指定另一个短名称。行为似乎总是做我想要的,即无论我使用长名称还是短名称,值都会分配给函数,如下所示。这有什么危险吗?
def flongname():
pass
f = flongname
f.f1 = 10
flongname.f2 = 20
print flongname.f1, f.f2
最后一行返回10 20
,表明不同的函数名称引用相同的函数对象。正确?
答案 0 :(得分:5)
id
表明f
和flongname
都是对同一对象的引用。
>>> def flongname():
... pass
...
>>> f = flongname
>>> id(f)
140419547609160
>>> id(flongname)
140419547609160
>>>
是的 - 你所经历的行为是预期的。
答案 1 :(得分:3)
f = flongname # <- Now f has same id as flongname
f.f1 = 10 # <- a new entry is added to flongname.__dict__
flongname.f2 = 20 # <- a new entry is added to flongname.__dict__
print flongname.f1, f.f2 # Both are refering to same dictionary of the function
看起来它似乎并不危险,只记得其他人没有修改它dict
In [40]: f.__dict__
Out[40]: {}
In [41]: flongname.__dict__
Out[41]: {}
In [42]: f.f1=10
In [43]: flongname.__dict__
Out[43]: {'f1': 10}
In [44]: f.__dict__
Out[44]: {'f1': 10}
In [45]: flongname.f2 = 20
In [46]: f.__dict__
Out[46]: {'f1': 10, 'f2': 20}