3

グローバル変数を使用する代わりに、関数属性を使用して変数値を設定したいと考えています。しかし、関数に別の短い名前を割り当てることがあります。以下に示すように、動作は常に私が望むことを行うようです。つまり、長い名前を使用するか短い名前を使用するかに関係なく、値が関数に割り当てられます。これに危険はありますか?

def flongname():
    pass

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

そして最後の行は10 20、異なる関数名が同じ関数オブジェクトを参照していることを示しています。右?

4

2 に答える 2

5

idfとの両方flongnameが同じオブジェクトへの参照であることを示しています。

>>> 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 に答える