2017-03-21 3 views
1

私は、オブジェクトのインスタンス化を反復処理すると複数のオブジェクトを作成するかどうかについて疑問を抱いていました。1つのインスタンス化に対する反復。なぜコンソールは2つの異なるオブジェクトを表示しますか?

class Foo: 
    def __init__(self, msg): 
     self.msg = msg 
     print(self.msg, self) 

    for i in range(7): 
     a = Foo(i) 

しかし、コンソールは、この例を示します:私はチェックして、このテストをした私は1つのオブジェクトのみをインスタンス化していますと仮定

0 <__main__.Foo object at 0x010BA470> 
1 <__main__.Foo object at 0x010BA4F0> 
2 <__main__.Foo object at 0x010BA470> 
3 <__main__.Foo object at 0x010BA4F0> 
4 <__main__.Foo object at 0x010BA470> 
5 <__main__.Foo object at 0x010BA4F0> 
6 <__main__.Foo object at 0x010BA470> 

、なぜコンソールを繰り返し、メモリ内の2つの異なるオブジェクトを報告し(0x010BA470と0x010BA4F0)?

+0

あなたが作成したすべてのインスタンスへの参照を保持するとどうなるかを見るには '[Foo(i)for i in range(7)]'を試してください。 – jonrsharpe

答えて

0

Foo(i)を呼び出すたびに、新しいオブジェクトが作成されます。したがってforループでは、最初のサイクルで0x010BA470に空き領域があり、そのオブジェクトが作成され、オブジェクトアドレスが変数aに割り当てられました。次のサイクルでは、0x010BA470のスペースはまだaによって保持されていたため、新しい場所0x010BA4F0に空きスペースがあり、そこにオブジェクトが作成され、そのアドレスがaに割り当てられました。変数aは新しい場所に新しいオブジェクトを保持し、0x010BA470の領域が解放されました。その後、3番目のサイクルで、0x010BA470の領域が新しいオブジェクトに割り当てられました。したがって、ループ内で作成された新しいオブジェクトの2つの場所が交互に表示されていました。

3

複数のオブジェクトを作成しています。しかし、あなたもそれらを捨てています。したがって、新しいオブジェクトは毎回同じメモリを単に(再)割り当てます。

関連する問題