Лучший способ продемонстрировать это на простом примере кода:
aaa = 0
bbb = 0
objects_list = [aaa, bbb, aaa, bbb]
for obj in objects_list:
obj += 1
print(aaa)
print(bbb)
Я так понимаю, что таким образом при создании цикла список читается так:
objects_list = [0, 0, 0, 0]
Терминал печати:
0
0
Ожидаемый вывод в выводах терминала будет таким:
2
2
Я хотел бы воссоздать это здесь, но в цикле:
aaa += 1
bbb += 1
aaa += 1
bbb += 1
Есть ли способ создать список с именами объектов вместо их значений?
Не с целыми числами, потому что целые числа не могут быть изменены. Но если вы создадите свой собственный класс, который считает вещи, то ваш первый пример (objects_list = [aaa,bbb,aaa,bbb]
) будет работать почти так, как вы ожидаете.
Объекты не имеют имен в том смысле, что сам объект знает, какие переменные ссылаются на них. Сами имена не являются частью модели данных, это всего лишь исходный код, управляющий объектами.
Во-первых, спасибо всем за комментарии, я думал о создании нового чистого списка и использовании for i, obj in enumerate(...)
и использовании i для определения позиции добавляемого значения, но я хотел спросить, чтобы убедиться, что не было еще каких-то «правильных "кстати, я добавлю пример в вопрос
@BrondbyIF, что является - стандартный способ сделать это. Хотя более идиоматично было бы просто использовать создать новый список, возможно, используя понимание списка, object_list = [x + 1 for x in object_list]
Вы не можете этого сделать, поскольку целые числа неизменяемы, но есть способ обойти это:
objects_list = ["aaa", "bbb", "aaa", "bbb"] # Note that they are strings
for obj in objects_list:
globals()[obj] += 1
Обратите внимание, что этот тип программирования не рекомендуется, так как он запутает будущих сопровождающих и приведет к скрытым и трудно обнаруживаемым ошибкам.
Спасибо за ответ, а также спасибо за предупреждения!
Python int неизменяем. То, что вы просите, это сохранить «указатель» на список. Это невозможно для целого числа, но нужен объект. Вот пример того, как работают объекты:
class ValueWrapper(object):
def __init__(self, value):
self.value = value
def __iadd__(self, x):
self.value += x
def __str__(self):
return str(self.value)
aaa = ValueWrapper(0)
bbb = ValueWrapper(0)
objects_list = [aaa,bbb,aaa,bbb]
for obj in objects_list:
obj += 1
print(aaa)
print(bbb)
Вышеуказанные коды дают результаты
2
2
Большое спасибо за ответ, мне было очень интересно, я хотел бы задать последний вопрос, есть ли у этого метода какие-либо ограничения или риски использования или это вариант, который я могу использовать без будущих рисков? (друг, выложивший другой вариант, предупредил меня, что в указанном им способе могут быть риски использования, отсюда и мой вопрос). Заранее спасибо за внимание!
«Вы просите сохранить «указатель» на список. Это невозможно для целого числа, но нужен объект». ваше объяснение вводит в заблуждение. Для начала int
объекты объекты. И когда вы помещаете int
в list
, вы фактически сохраняете указатель на этот объект списка под капотом в точно так же, как вы делаете для своего пользовательского объекта ValueWrapper
.
Привет @juanpa.arrivillaga В таком случае не будет ли надежно работать с этим методом? Он также попадает в риск использования и не становится показанным?
@BrondbyIF Я не понимаю вашего вопроса. Вышеуказанный метод будет работать нормально и надежно, он просто не служит абсолютно никакой цели и представляет собой чрезмерно разработанное решение для решения проблемы, которой на самом деле не существует.
Теперь я понимаю, что вы имели в виду в своем сообщении @juanpa.arrivillaga. Спасибо за информацию!
@ juanpa.arrivillaga Я думаю, вы правы, когда говорите, что int является объектом, а список сохраняет указатели. Когда я упомянул «указатель» в ответе, я имел в виду, что мы не сохраняем «имя», как Брондби задал вопрос.
Поверьте, вы ищете
dict