2016-08-16 10 views
0

私はPythonで簡単なスクリプトを書いています。これはtestクラスの10000インスタンスのリストを作成します。次に、リスト内のすべての要素をループし、変数xの値をid_generatorメソッドを使用して生成されたランダムな文字列に変更しています。Pythonのリストから価値を得る

import string 
import random 


def id_generator(size=6, chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(chars) for _ in range(size)) 

class test: 
    x = None 
    y = None 

d = test 

lista = [d] * 10000 

w = 0 
while (w < 10000): 
    lista[w].x = id_generator() 
    w = w + 1 

print(lista[3].x) 
print(lista[40].x) 
print(lista[1999].x) 

出力に同じ値が3つあるのはなぜですか? id_generator()

+0

あなたがテスト_class_ 10000 _references_のリストを持っているので。このようなリストを作成するには、 'lista = [xrange(10000)の_のためのtest()]'です。ループも醜いですが、代わりにforと置き換えてください。 – myaut

+0

'lista [1]はlista [1493]'は 'True'を返します。それはあなたのリストに10000回ある単一のオブジェクトだけを作成するためです。 – syntonym

+0

私はあなたが「このコードが何をテストしたのか」を理解しておかなければならないので、私は下降しました。 lista = [d] * 10000'となっています。 – nbro

答えて

6

クラスのインスタンスを作成しておらず、testクラスのクラス属性xを直接参照しているため、3つの異なる値を生成しないでください。あなたはまた、それ故に__init__()の内側に、それらを定義し、インスタンス属性として、あなたの属性を宣言する必要があります。

import string 
import random 

def id_generator(size=6, chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(chars) for _ in range(size)) 

class test: 

    def __init__(self): 
     self.x = None 
     self.y = None 

# Create 10000 instances of the test class 
lista = [test() for _ in range(10000)] 

w = 0 
while (w < 10000): 
    lista[w].x = id_generator() 
    w = w + 1 

print(lista[3].x) 
print(lista[40].x) 
print(lista[1999].x) 
1

次の3つの異なるミスを作っている:クラス属性インスタンスの属性を使用する必要があります

  1. 、およびない:

    class test: 
        def __init__(self): 
         self.x = None 
         self.y = None 
    
  2. testクラスをインスタンス化する必要があります。あなたは書く必要があります:

    d = test() 
    
  3. [d]*10000を書くことによって、あなたは実際には、同じオブジェクトの10000コピーを記憶しています。代わりに書く:

    # notice that you can get rid of the 'd' object 
    lista = [test() for i in range(0, 10000)] 
    
関連する問題