Переменные в 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)