Как создать уникальные списки среди объектов класса Python? - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь создать класс python, который хранит список равномерно распределенных случайных чисел для каждого класса, но числа должны быть уникальными для этого класса. Однако список в каждом новом объекте копируется точно так же, как и из первого объекта, и если я вручную добавляю новые значения к содержимому списка второго объекта, то же самое изменение применяется к списку первого объекта и для каждого нового класса, который я создаю. список снова копируется, и он добавляет столько значений, сколько я указал.

Код выглядит следующим образом:

import random as random

class myClass:
    myRandomList = []

    def __init__(self, lengthOfList):
        for i in range(0,lengthOfList):
            self.myRandomList.append(random.uniform(-1.0,1.0))

a = myClass(2) #make a list with 2 random numbers
b = myClass(1) #make a list with 1 random number
print(a.myRandomList)
print(b.myRandomList)

Вывод вышеуказанного кода дает следующее:

[0.3640932307078235, 0.8858169279430881, 0.18712932281033723]
[0.3640932307078235, 0.8858169279430881, 0.18712932281033723]

Когда он должен давать что-то вроде этого, скорее:

[0.3640932307078235, 0.8858169279430881]
[0.18712932281033723]

Как я могу сделать так, чтобы при создании нового класса он создавал совершенно новый список значений только для этого класса, не копируя список из ранее созданного объекта и не затрагивая списки предыдущего объекта?

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Просто объявление self.myRandomList в __init__, а не в объявлении класса, делает трюк.

class myClass:
    def __init__(self, lengthOfList):
        self.myRandomList = []
        for i in range(0,lengthOfList):
            self.myRandomList.append(random.uniform(-1.0,1.0))
0 голосов
/ 06 сентября 2018

Если вы хотите, чтобы у каждого объекта были уникальные номера во всех экземплярах, вам нужно, чтобы каждый экземпляр проверял сгенерированные значения на уровне class set, чтобы гарантировать уникальность.

import random as random

class MyClass:

    class_random_set = set()

    def __init__(self, lengthOfList):
        self.my_random_set = set()
        for _ in range(0, lengthOfList):
            while True:
                num = random.uniform(-1.0, 1.0)
                if num not in self.class_random_set:
                    self.class_random_set.add(num)
                    self.my_random_set.add(num)
                    break


a = MyClass(2) #make a set with 2 random numbers
b = MyClass(1) #make a set with 1 random number
print(a.my_random_set)
print(b.my_random_set)
0 голосов
/ 06 сентября 2018

Я думаю, что вы хотите, чтобы каждый экземпляр класса (т. Е. A и b в вашем коде) имел собственный список случайных чисел, соответствующий длине, указанной вами при создании экземпляра. Для этого вы должны установить self.myRandomList в пределах init . Вот изменение вашего исходного кода:

import random as random

class myClass:

  def __init__(self, lengthOfList):
    self.myRandomList = []
    for i in range(0,lengthOfList):
      self.myRandomList.append(random.uniform(-1.0,1.0))

a = myClass(2) #make a list with 2 random numbers
b = myClass(1) #make a list with 1 random number
print(a.myRandomList)
print(b.myRandomList)

То, что вы делали раньше, устанавливали myRandomList как переменную класса, которая всегда будет использоваться всеми экземплярами класса, а не переменной экземпляра. Подробнее смотрите здесь: https://www.digitalocean.com/community/tutorials/understanding-class-and-instance-variables-in-python-3

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...