Лучший способ изменить значение глобального значения внутри функции в Python?

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

Я хочу что-то вроде этого:

x = 5

def foo(_):
    global _
    
    _ = 10
    
    return _
    
foo(x)

print(x)

где x теперь будет равен 10 вместо фактического результата, который равен 5. Каков наиболее эффективный способ достичь того, что я хочу?


person Neoking    schedule 11.01.2021    source источник
comment
Вы не можете передавать или возвращать переменные в Python. Вы можете только передавать или возвращать объекты. (Кроме того, у вас действительно не должно быть так много глобальных переменных.)   -  person user2357112 supports Monica    schedule 11.01.2021
comment
Можете ли вы поделиться проблемой, которую вы пытаетесь решить? Я не думаю, что это лучший способ решить любой код, который вы пытаетесь исправить. Я бы создал класс, имел текущие глобальные переменные в качестве свойств этого класса, а foo был бы методом. Другой вариант — просто присвоить новое значение x вместо того, чтобы менять его на месте.   -  person Mikael    schedule 11.01.2021
comment
Обязательная ссылка на Неда Батчелдера   -  person quamrana    schedule 11.01.2021
comment
Я много работаю с множеством глобальных переменных в Python, значение которых постоянно нужно менять по мере выполнения моего кода. Обычно это считается плохим дизайном.   -  person juanpa.arrivillaga    schedule 11.01.2021
comment
@ Микаэль Да. Я создаю игру в блэкджек в рамках курса Udemy по Python. У меня всего несколько месяцев опыта работы с Python. Чтобы представить это в перспективе, на данный момент я только начал использовать классы. Проблема, которую я хотел решить, была не конкретной, а скорее общей: я хочу использовать функции гибким способом, чтобы изменять мои переменные из моих классов, а также глобальные переменные и комбинировать их, например, для условий, сравнения и т. д. Я буду опубликуйте мой код игры в блэкджек на странице обзора кода, как только он будет готов, так как я думаю, что это слишком много, чтобы публиковать здесь. Спасибо!   -  person Neoking    schedule 12.01.2021
comment
@quamrana Спасибо, это действительно полезная ссылка для меня.   -  person Neoking    schedule 12.01.2021
comment
@juanpa.arrivillaga Большое спасибо за эту информацию. Я новичок в Python, поэтому очень хорошо знать об этом. Я думаю, что использование слишком большого количества глобальных переменных может быть одной из причин, по которой я задаю этот вопрос в первую очередь :)   -  person Neoking    schedule 12.01.2021


Ответы (2)


Так как вы пытаетесь назвать x при вызове foo(x), не так уж сложно сделать x = foo(x):

x = 5

def foo(_):
    _ = 10
    return _
    
x = foo(x)

print(x)
person quamrana    schedule 11.01.2021
comment
Задание ненужное. def foo(_): return 10 будет иметь тот же эффект. - person chepner; 11.01.2021
comment
@anurag какое значение имеет здесь лямбда-выражение? - person juanpa.arrivillaga; 11.01.2021
comment
@juanpa.arrivillaga спасибо! Это выглядит как самое простое решение для того, чего я хочу достичь. - person Neoking; 12.01.2021

Возможно, я не совсем понял вашу потребность в этом, но вы также можете управлять глобальными переменными следующим образом:

x = globals()
x['cartoon'] = 'mickey'
print(x['cartoon'])
person anurag    schedule 11.01.2021