3

我想使用函数属性来设置变量值作为使用全局变量的替代方法。但有时我会为函数分配另一个短名称。该行为似乎总是按照我的意愿行事,即无论我使用长名称还是短名称,都会将值分配给函数,如下所示。这有什么危险吗?

def flongname():
    pass

f = flongname
f.f1 = 10
flongname.f2 = 20
print flongname.f1, f.f2

最后一行返回10 20显示不同的函数名引用同一个函数对象。正确的?

4

2 回答 2

5

id表明两者fflongname都是对同一对象的引用。

>>> def flongname():
...     pass
... 
>>> f = flongname
>>> id(f)
140419547609160
>>> id(flongname)
140419547609160
>>> 

所以是的-您正在经历的行为是预期的。

于 2013-01-16T05:38:25.390 回答
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}
于 2013-01-16T05:43:43.400 回答