2016-08-10 20 views
0

時に新しいインスタンスを作成しないと、私はここで本当に基本的な何かが欠けていますことが、私は次のようにクラスを定義するときにする可能性があります。クラスを繰り返し呼び出し

class Arbitrary(object): 
    """Arbitary class to test init""" 
    def __init__(self): 
     self.x = dict() 

と繰り返しは、次のよう

でクラスをインスタンス化
for i in range(5): 
    a = Arbitrary() 
    print '{} {} {} {}'.format(i, a, id(a), a.x) 

私はそれが期待しているように全く新しいインスタンスArbitrary()を取得していません。実際、私は2つのインスタンスの繰り返しを得ています:

0 <__main__.Arbitrary object at 0x1006cb110> 4302090512 {} 
1 <__main__.Arbitrary object at 0x1006cb190> 4302090640 {} 
2 <__main__.Arbitrary object at 0x1006cb110> 4302090512 {} 
3 <__main__.Arbitrary object at 0x1006cb190> 4302090640 {} 
4 <__main__.Arbitrary object at 0x1006cb110> 4302090512 {} 

なぜですか?

Arbitrary()を呼び出すたびにまったく新しいインスタンスが返されるように、__init__を自分のクラスに定義するにはどうすればよいですか?

+3

これらのオブジェクトは、次の反復によって除去し、それらへの参照のみを持っています。ではなぜ通訳は記憶を再利用しないでしょうか? –

+0

これは、この問題を説明する極端な例でした。私の経験では、Arbitrary()への2回の別々の呼び出しが同じインスタンスを返すため、目的が無効になりました。なぜそれが起こっているのか理解しようとしています。ありがとう。 –

+0

代わりに 'Arbitrary'オブジェクトのリストを作り、それがまだ起こっているかどうかを確認してください。 –

答えて

4

私はPythonのエキスパートではありませんが、私はあなたがインスタンスを圧倒しているのがわかります。私は以下にそれを変更してみました、それは大丈夫実行します:

#!/bin/env python 

class Arbitrary(object): 
    """Arbitary class to test init""" 
    def __init__(self): 
     self.x = dict() 

a = [] 
for i in range(5): 
    a.append(Arbitrary()) 
    print '{} {} {} {}'.format(i, a[i], id(a[i]), a[i].x) 

結果:

[email protected]:~/python/test2] test2.py 
0 <__main__.Arbitrary object at 0x7fc6952b6090> 140490882900112 {} 
1 <__main__.Arbitrary object at 0x7fc6952b6250> 140490882900560 {} 
2 <__main__.Arbitrary object at 0x7fc6952b6290> 140490882900624 {} 
3 <__main__.Arbitrary object at 0x7fc6952b62d0> 140490882900688 {} 
4 <__main__.Arbitrary object at 0x7fc6952b6310> 140490882900752 {} 
+1

あなたは正しいです。 Pythonは自動ガベージコレクションを行い、OPのコードでは、新しい値が割り当てられるたびに 'a'の前の値が破棄されました。 2つ目のオブジェクトがガベージコレクションされる前に作成されていることがあります。 – martineau

+1

2つ目のオブジェクトは、最初にガベージコレクションされる前に作成されます。この場合、順序は関係ありませんが、 'a = a + ['some'、 'list']のようなステートメントがあればそれになります。 –

関連する問題