mterrorist
@mterrorist
Черный пояс по тупым вопросам

Почему значение переменной изменилось? И почему не изменилось?

x = 15
y = [5, 4, 7, 3]

def ne_pridumal_kak_nazvat(chislo):
    chislo += 1

def ne_pridumal_kak_nazvat2(spisok):
    spisok.append(5)

ne_pridumal_kak_nazvat(x)

ne_pridumal_kak_nazvat2(y)

print(x)
print(y)


У x и у y свои значения, для каждой из них сделал по функции. Обе функции что-то делают с переменными. Но одна функция меняет значение переменной, а другая нет. В чем прикол?

результат
15
[5, 4, 7, 3, 5]
  • Вопрос задан
  • 551 просмотр
Пригласить эксперта
Ответы на вопрос 2
Sly_tom_cat
@Sly_tom_cat
.
В первом случае передается значение скалярной переменной. И ее изменение остается в рамках функции.

Во втором случае передается список, который является фактически ссылкой.

В таких языках как С есть явное и однозначное управление тем что передается в функцию. Если хотите чтобы значение в функции менялось - передавайте ссылку на значение, не хотите изменений - передавайте само значение. Правда и внутри таких двух функций надо использовать разные нотации для доступа к таким переменным.
В Python все немного упрощено, и поэтому возникают такие неоднозначности. В нем к примеру значение 1 у всех переменных, которые это значением имеют, хранится в одном и том же месте. Но вот значение 30000 в одной переменной и то же значение 30000 в другой, будут хранится в разных местах.
Есть еще много всяких нюансов проистекающих из упрощений Python-а.
Ответ написан
Комментировать
@trofimovdev
Python
Потому что функция не сохраняет значение, а только возвращает.
Для того, чтобы переменная изменилась, надо написать так:
x = 15
def ne_pridumal_kak_nazvat(chislo):
    chislo += 1
    return chislo # возвращаем значение
x = ne_pridumal_kak_nazvat(x)
print(x) # 16

или так (не рекомендуется)
x = 15
def ne_pridumal_kak_nazvat():
    global x
    x += 1
ne_pridumal_kak_nazvat()
print(x) # 16


В первом случае мы передаем в функцию число x = 15, прибавляем к нему 1, возвращаем полученное число и записываем как новый x.
Во втором случае мы создаем глобальную переменную x (то есть она доступна как в функции, так и вне нее), поэтому все изменения, которые мы будем делать отразятся на x (еще раз повторю: крайне не рекомендую использовать глобальные переменные).

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

Войдите, чтобы написать ответ

Похожие вопросы