Найти - Пользователи
Полная версия: Не работает код для переопределения элементов в массиве
Начало » Python для новичков » Не работает код для переопределения элементов в массиве
1
rudm
Набросал простой пример проблемы. Есть класс созданныя для выбора и сравнения значений цветов из массивов(Менять класс нельзя). Некоторые значения хранятся не в массивах, а в переменных (Менять нельзя).
После того как значения выбраны, необходимо произвести проверку, и если среди значений есть ‘blank’, то есть “пустой” цвет, переопределять остальные значения цветов на ‘blank’.

import random

#Данные
colors_one = [('brown', 1), ('black', 1), ('green',1),
('blue', 0), ('gray', 0), ('blank', 1)]

colors_two = [('white', 0), ('black', 2), ('gray', 3),
('green', 1), ('yellow', 0), ('red', 1),
('blank', 0)]

class define_color:
#Выбирает два случайных цвета из массива, сравнивает их
#индексы и присваивает переменной main_color тот
#признак у которого индекс выше.
def __init__(self, seq):
#Описываем переменные
self.sequence = seq
self.choice_one = random.choice(self.sequence)
self.choice_two = random.choice(self.sequence)
self.main_color = 'N/A'

#Сравниваем
if self.choice_one[1] > self.choice_two[1]:
self.main_color = self.choice_one[0]

if self.choice_one[1] < self.choice_two[1]:
self.main_color = self.choice_two[0]

if self.choice_one[1] == self.choice_two[1]:
self.main_color = self.choice_one[0]

#Создаем несколько экземпляров класса для тестирования
color_one = define_color(colors_one)
color_two = define_color(colors_two)

#Поскольку некоторые значения хранятся не как атрибут класса
#а как обычные переменные, создаем обычные переменные
color_three = "N/A"
color_four = "blank"

#Выводим отладочную информацию
#До переопределния
print("Unchanged values")
print("color one", color_one.main_color)
print("color two", color_two.main_color)
print("color three", color_three)
print("color four", color_four)

#Начинаем проверку на вхождение "blank"
#Создаем массив куда помещаем значения переменных и атрибутов класса
color_list = [color_one.main_color, color_two.main_color,
color_three, color_four]

#Cчетчик для цикла
col_counter = len(color_list) - 1

#Перебираем значения хранящиеся в массиве и если видим хоть один пустой цвет
#переопределяем остальные цвета на пустой (blank).
if "blank" in color_list:
while col_counter != 0:
color_list[col_counter] = "blank"
col_counter = col_counter - 1

#Просто разделитель
print('-----------------------------------')

#Выводим отладочную информацию
#После переопределния
print("Changed values")
print("color one", color_one.main_color)
print("color two", color_two.main_color)
print("color three", color_three)
print("color four", color_four)

Насколько я понимаю, проблема в том, что в массиве color_list хранятся копии переменных, а не сами переменные хранящиеся в color_one.main_color, color_four и т.д. Соответственно, цикл присваивает значения blank именно этим копиям, что само собой, никак не влияет на исходные значения переменных, хранящихся в color_one.main_color, color_two.main_color и т.д. Верна ли моя догадка? Возможно ли, сделать так, что бы значения присваивались не копиям, а самим переменным?

Очень полезна была бы функция, которая позволяет получить порядковый номер элемента массива, по его значению. Вроде бы раньше в питоне, что то такое было?

Я не придумал ничего лучше, кроме как обращаться к переменным напрямую.
if "blank" in color_list:
color_one.main_color = 'blank'
color_two.main_color = 'blank'
color_three = 'blank'
color_four = 'blank'
Но может быть есть более правильное решение? Ведь переменных может быть не четыре, а четыре сотни к примеру.
Master_Sergius
Есть такая штука - слоты (__slots__), покопайте в эту сторону
хотя… тут наверное лучше через словарь сделать и всё…
py.user.next
rudm
После того как значения выбраны, необходимо произвести проверку, и если среди значений есть ‘blank’, то есть “пустой” цвет, переопределять остальные значения цветов на ‘blank’.
придётся сделать функцию, которая меняет всё: глобальные переменные устанавливает и у объектов вызывает метод изменения атрибутов

rudm
Менять класс нельзя
придётся добавить метод, который делает изменение всех атрибутов (объект сам должен знать, какие у него атрибуты внутри)

rudm
Ведь переменных может быть не четыре, а четыре сотни к примеру.
переменных может быть не только много, но и имена у них могут меняться

rudm
Но может быть есть более правильное решение?
сначала избавиться от глобальных переменных

rudm
Очень полезна была бы функция, которая позволяет получить порядковый номер элемента массива, по его значению.
help(list)
help(list.index)

вообще, сильно отдаёт тем, что ты не знаешь, что такое структурное программирование
разработку нужно вести сверху вниз:
1. мне нужна рука, чтобы взять яблоко
2. делаю руку, будто она есть
2.1. чтобы рука взяла яблоко, нужно её протянуть
2.1.1. чтобы протянуть руку, нужны суставы
2.2. делаю суставы, будто они есть
2.3. чтобы рука взяла яблоко, нужно его зажать
2.3.1. чтобы зажать яблоко, нужна кисть
2.4. делаю кисть, будто она есть
2.4.1. чтобы яблоко не вывалилось, нужно его удерживать
2.4.1.1. чтобы удерживать, нужны пальцы
2.4.2. делаю пальцы, будто они есть

после выполнения 2-го пункта у тебя есть работающая рука, но она состоит из заглушек - то есть суставы мнимые, кисть мнимая
когда ты даёшь команду руке взять яблоко, она тебе сообщает, что взяла его
когда это всё отлажено, ты приступаешь к разработке суставов и кисти
суставы становятся настоящими, но кисть состоит из заглушек - то есть пальцы на ней мнимые
когда рука кисти даёт команду зажать яблоко, та ей сообщает, что яблоко зажато
когда это всё отлажено, ты приступаешь к разработке пальцев
у них там тоже суставы есть

вот так делаешь, пока не дойдёшь до дна (разрабатывать будет больше нечего)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB