Python: сохранить изменения, внесенные в функцию - PullRequest
0 голосов
/ 11 ноября 2018

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

Вот упрощенный пример моей проблемы:

y = 1
x = None

def test(var):

    var = y

    return var 


test(x)
print(x)

Печать просто не возвращает ни одного,Поэтому изменения, внесенные в переменную внутри функции, не являются постоянными.

Как я могу внести изменения во входную переменную функции постоянные?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Переменные в Python - это просто имена, которые ссылаются на объекты.В выражении имя является заменой для реального объекта.Сказать test(x) означает «передать объект, на который указывает x, в test».Это не означает «передать символ x в test».

Кроме того, переназначение имени изменяет только то, к какому объекту относится это имя .Он не влияет ни на объект, ни на его псевдонимы.

Короче говоря, имя var, которое вы изменяете внутри test, никак не связано с x.


Предпочтительный способ заставить функцию что-то изменить - переназначить результат:

x = 2
def change(var):
    return var * 2

x = change(x)  # x now refers to 4 instead of 2
print(x)

Если вы хотите изменить имя вне функции, вы можете использовать ключевые слова nonlocal и global:

x = 2
def change_x():
    global x
    x = x * 2

change_x()  # x now refers to 4 instead of 2
print(x)

Хотя это может облегчить решение некоторых тривиальных проблем, для больших программ это, как правило, плохая идея.Использование глобальных переменных означает, что больше нельзя использовать функцию в изоляции;результаты могут зависеть от того, как часто и в каком порядке вызывается такая функция.


Если у вас есть какая-то отдельная группа значений и средства для их изменения, для описания этого можно использовать класс:

class XY:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def swap(self):
        self.x, self.y = self.y, self.x

my_values = XY(None, 1)
print(my_values.x, my_values.y)
my_values.swap()
print(my_values.x, my_values.y)

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


Вы также можете изменять значения, чтобы изменения были видны извне.Вместо изменения имени вы изменяете значение.

x = [2]  # x is a mutable list, containing the value 2 at the moment
def change(var):
    var[0] = 4

change(x)  # x now contains 4 instead of 2
print(x)
0 голосов
/ 11 ноября 2018

Это пример передачи переменных в функции по значению. По умолчанию, когда вы передаете переменную функции в Python, она передается по значению.

Это означает, что создается новая переменная с новой областью действия с тем же значением x. Таким образом, любое изменение, которое происходит с новым x, не отражается в x вне области действия функции.

Если вы хотите получить значение из функции обратно, вы можете использовать оператор return (как вы уже использовали). return возвращает значение обратно из функции. Однако в вашем примере нет переменной для ее получения. Следовательно, оно потеряно.

Вы должны вызывать функцию как x = test(x). Это гарантирует, что x получит значение обратно из функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...