2016-08-16 5 views
0

Я пишу простой скрипт в Python, который создает список из 10000 экземпляров класса test. Затем я просматриваю каждый элемент в списке и изменяю значение переменной 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 одинаковых значения на выходе? Должен ли я получить 3 разных значения, сгенерированных с использованием id_generator()

+0

Потому что вы получили список 10000 _references_ для тестового _class_. Чтобы создать список, выполните следующие действия: 'lista = [test() for _ in xrange (10000)]'. Хотя цикл тоже уродливый, замените его на in in ... – myaut

+0

'lista [1] is lista [1493]' возвращает 'True'. Это потому, что вы создаете только один объект, который 10000 раз в вашем списке. – syntonym

+0

Я проигнорировал, потому что вы «должны были понять», что этот код 'd = test; lista = [d] * 10000' предполагается. – nbro

ответ

6

Поскольку вы не создаете экземпляр своего класса, и вы прямо ссылаетесь на атрибут класса x класса test. Вы также должны объявить свои атрибуты, как атрибуты экземпляра, следовательно, определяя их внутри __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

Вы делаете три ошибки:

  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)] 
    
Смежные вопросы