Расскажите про переменные и значения. Что там как работает?

Дмитрий

5-й уровень

Переменные

Переменные в python это именованные ссылки на значения. Благодаря динамической типизации любая переменная может ссылаться на любое значение.

>>> a = 1
>>> a = 'abcd'
>>> a = [1,2,3,4]

Значения

В свою очередь, значение - это объект какого то класса. Любые данные в python являются объектами. Объекты могут быть изменяемыми и неизменяемыми.

Присваивание переменных

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

>>> a = 'abcd'
>>> b = a # Важно! Присваивание копирует не значения, а ссылки на них
>>> b
'abcd'
>>> a = 123 # 'a' теперь ссылается на другое значение, но 'b' хранит всю ту же ссылку
>>> b
'abcd'

Продолжая эту тему:

>>> a = ['a','b','c']
>>> b = a
>>> a.append('d') # Изменяем объект, на который ссылаются 'a' и 'b'
>>> b
['a', 'b', 'c', 'd']

И еще:

>>> a = 1
>>> b = a 
>>> a += 1 # Теперь 'a' ссылается на новое значение - результат суммы 'a + 1'
>>> a
2
>>> b # 'b' по прежнему указывает на '1', этот объект не изменился
1

Передача переменных в функцию

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

def reverse_list(list_to_reverse):
    list_to_reverse.reverse()

my_list = ['a', 'b', 'c', 'd']
reverse_list(my_list)
print(my_list) # ['d', 'c', 'b', 'a']

Подсчет ссылок и сборка мусора

Любой объект в python, на который ссылается переменная, помимо данных, всегда хранит в себе тип этих данных и счетчик ссылок на этот объект. Счетчик ссылок используется для сборки мусора. Работает это таким образом: когда на объект больше не ссылается ни одна переменная (например при выходе из области видимости функции) - объект удаляется.

Хорошая статья про переменные и значения (на английском): https://nedbatchelder.com/text/names.html