Я хочу изменить параметры в списке элементов QF и QD следующим образом: Решетка представляет собой список, включающий, например, следующие элементы:
lattice = [QF, QD, QF, QD]
А индексы этих элементов в списке задаются в quad_indexes.
QF и QD имеют два параметра (K и FamName):
QF.K = 1.7 and QD.K = -2.1
QF.FamName = 'QF'
QD.FamName = 'QD'
Я хочу дать случайное значение параметра K для каждого элемента в отдельности
Я попытался:
i =0
Quad_strength_err =[]
while(i < len(quad_indexes)):
if (lattice[quad_indexes[i]].FamName == 'QF'):
lattice[quad_indexes[i]].K *= (1 + errorQF*random())
i += 1
elif (lattice[quad_indexes[i]].FamName == 'QD'):
lattice[quad_indexes[i]].K *= (1 + errorQD * random())
i += 1
for j in quad_indexes:
quad_strength_err = lattice[j].K
Quad_strength_err.append(quad_strength_err)
Проблема в том, что когда я печатаю (Quad_strength_err), я получаю фиксированное значение для каждого из QF и QD, например:
[1.8729820159805597, -2.27910323371567, 1.8729820159805597, -2.27910323371567]
Я ищу результат, например:
[1,7729820159805597, -2,17910323371567, 1,8729820159805597, -2,27910323371567]
@ScottHunter Я ищу результат, например: [1.7729820159805597, -2.17910323371567, 1.8729820159805597, -2.27910323371567]
@ely66 ely66, до сих пор не понял твоей цели. Можете ли вы привести минимальный воспроизводимый пример? Мы не можем запустить ваш код, так как некоторые данные отсутствуют, и вы не указали, какую случайную функцию вы используете.
Вы проверили, что ваш сгенерированный случайный поплавок отличается
В вашей структуре данных много косвенности. Может быть, lattice[0]
— это псевдоним lattice[3]
? На самом деле проблема почти наверняка в этом: строка lattice = [QF, QD, QF, QD]
создает указатели на QF
и QD
, а не копии.
@joains, Да, решетка [0].FamName = 'QF', а также решетка [0].FamName = 'QF' Но я хочу рассматривать каждую из них по отдельности, как я могу это решить?
@ely66 ely66 Смотрите мой ответ для решения.
Вам нужно сделать копии QF и QD - вы делаете псевдонимы.
Проблема почти наверняка связана с алиасингом.
Когда вы инициализируете lattice
этой строкой:
lattice = [QF, QD, QF, QD]
что вы делаете, так это создаете структуру с двумя указателями на QF
и двумя указателями на QD
.
Затем в своем цикле вы дважды изменяете QF
, один раз через lattice[0]
и снова через lattice[2]
, и то же самое для QD
.
Что вам нужно сделать, так это создать копии, может быть поверхностные, а может быть, глубокие.
Попробуйте этот вариант:
from copy import copy
lattice = [copy(QF), copy(QD), copy(QF), copy(QD)]
и если это все еще не работает, вам может понадобиться глубокая копия:
from copy import deepcopy
lattice = [deepcopy(QF), deepcopy(QD), deepcopy(QF), deepcopy(QD)]
Или более компактная версия того же кода, просто потому что мне нравятся понимания:
from copy import deepcopy
lattice = [deepcopy(x) for x in (QF, QD, QF, QD)]
Решение отлично работает с deepcopy
Если ваш код правильный, вы не можете ожидать другого результата для вашего первого и третьего элемента lattice
(соответственно второго и последнего), поскольку это (для упрощения) один и тот же элемент.
Используя id
, вы можете легко показать, что lattice[0]
и lattice[2]
имеют один и тот же идентификатор, поэтому изменение lattice[0]
изменит lattice[2]
.
Вы можете дублировать каждый объект QF и QD, чтобы избавиться от этого поведения.
Я попытался создать рабочий пример вашей проблемы, начав с создания простых классов QF
и QD
:
from random import random
class QF():
def __init__(self):
self.K = 1.7
self.FamName = "QF"
class QD():
def __init__(self):
self.K = -2.1
self.FamName = "QD"
затем я создаю решетку с другим экземпляром класса, вызывая их с помощью ()
lattice = [QF(), QD(), QF(), QD()]
Я думаю, что ваша ошибка связана с этим шагом, поскольку QF
относится к самому классу и QF
создает совершенно новый экземпляр, который вы можете изменить отдельно от другого. Например, если вы делаете QF.K = 3
, а затем a = QF()
, a.K
должно вернуть вам 3
.
наконец, я применяю некоторую случайность, используя ранее импортированный random
:
for i in lattice:
if i.FamName == "QF":
i.K = (1 + errorQF*random())
elif i.FamName == "QD":
i.K = (1 + errorQD*random())
форма, которую я получаю:
print(*[i.K for i in lattice])
>>>> 1.148989048860669 0.9324164812782919 1.0652187255939742 0.6860911849022292
Непонятно, какой результат вы на самом деле хотели.