2016-09-29 5 views
1

私は本の中から以下のようなコードについて読んでいますが、説明されていませんでした。 ご覧のとおり、関数を呼び出す前に変数は存在しません。 しかし、関数呼び出しの後、var2はスタックからポップされ、func_aの名前空間から期待どおりに削除されました。しかし、var1はまだ存在する!関数呼び出しが終了した後に変数がまだ存在する理由-python

この現象を説明するにはどうすればよいですか? var1は特殊な変数ですか?この現象を説明する方法

def func_a(): 
    func_a.var1 = 1 
    var2 = 2 

>>> func_a.var1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'function' object has no attribute 'var1' 

>>> var2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'var2' is not defined 

>>> func_a() 
>>> func_a.var1 
1 
>>> var2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'var2' is not defined 

答えて

4

? var1は特殊な変数ですか?

はい、var1は特殊な種類の変数です。あるいは、もっと正確に言えば、それはまったく変わるものではありません。これはオブジェクトの属性です(オブジェクトが関数であっても)。オブジェクトは関数呼び出しの前に存在し、その後も存在し続けます。機能で

はグローバルオブジェクトではなく、ローカルスコープ内の変数を作成に属性を追加するあなたがある呼び出します。

+0

私は気に入っています、それはもっとクラスのようです。他の人が参照していないときは、オブジェクトをバージとして収集するのですか? –

+0

はい、オブジェクトは参照されていないときにガベージコレクションされます。 'var1'は参照されています - ' func_a'は参照しています。 –

2

関数の名前空間を関数オブジェクトと混同しています。関数が呼び出される前に、var1は存在しません。関数が呼び出されると、pythonはその呼び出しの一時的なローカル名前空間を作成します。関数がvar2 = 2に達すると、ローカル関数名前空間にvar2が作成されます。関数がfunc_a.var1 = 1に達すると、pythonはグローバルネームスペース内でfunc_aを見つけ、関数オブジェクトを見つけてvar1を追加します。関数が終了すると、ローカル名前空間は消えますが、関数オブジェクトはまだ存在しますので、var1も存在します。

関連する問題