Вопрос-Ответ

How can you dynamically create variables? [duplicate]

Как можно динамически создавать переменные?

Я хочу создавать переменные динамически в Python. Есть ли у кого-нибудь какие-нибудь творческие средства для этого?

Переведено автоматически
Ответ 1

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

a = {}
k = 0
while k < 10:
# dynamically create key
key = ...
# calculate value
value = ...
a[key] = value
k += 1

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

Ответ 2

globals() возвращает словарь переменных модуля. Вы можете создать новую переменную, создав ключ в этом словаре:

# By default, a module has some hidden variables defined
print({k: v for k, v in globals().items() if not k.startswith("__")})

for i in range(1, 11):
globals()[f"my_variable_{i}"] = i

print()
print(my_variable_1)
print(my_variable_2)
# and so on

print()
print({k: v for k, v in globals().items() if not k.startswith("__")})

Результат:

{}

1
2

{'i': 10, 'my_variable_1': 1, 'my_variable_2': 2, 'my_variable_3': 3, 'my_variable_4': 4, 'my_variable_5': 5, 'my_variable_6': 6, 'my_variable_7': 7, 'my_variable_8': 8, 'my_variable_9': 9, 'my_variable_10': 10}
Ответ 3

Используйте метод exec() для запуска произвольного кода. Допустим, у вас есть словарь, и вы хотите превратить каждый ключ в переменную с его исходным значением по словарю, вы можете сделать следующее:

>>> c = {"one": 1, "two": 2}
>>> for k, v in c.items():
... exec(f"{k} = {v}")
...
>>> one
1
>>> two
2
Ответ 4

Запихивать что-либо в глобальное и / или локальное пространства имен - плохая идея. Использование dict настолько похоже на какой-то другой язык ... d['constant-key'] = value просто выглядит неуклюже. Python - это OO. По словам мастера: """Пространства имен - это потрясающая идея - давайте делать больше таких!"""

Вот так:

>>> class Record(object):
... pass
...
>>> r = Record()
>>> r.foo = 'oof'
>>> setattr(r, 'bar', 'rab')
>>> r.foo
'oof'
>>> r.bar
'rab'
>>> names = 'id description price'.split()
>>> values = [666, 'duct tape', 3.45]
>>> s = Record()
>>> for name, value in zip(names, values):
... setattr(s, name, value)
...
>>> s.__dict__ # If you are suffering from dict withdrawal symptoms
{'price': 3.45, 'id': 666, 'description': 'duct tape'}
>>>
2023-07-04 03:23 python