Python RU
13.3K subscribers
966 photos
69 videos
40 files
1.22K links
Все для python разработчиков

админ - @notxxx1

@python_job_interview - Python собеседования

@ai_machinelearning_big_data - машинное обучение

@itchannels_telegram - 🔥лучшие ит-каналы

@programming_books_it - it книги

@pythonl

РКН: clck.ru/3Fmy2j
Download Telegram
Вопрос с собеседования

Что выведет этот код и почему?


a = [1, 2, 3]
b = a

a += [4, 5]

print(a)
print(b)

a = (1, 2, 3)
b = a

a += (4, 5)

print(a)
print(b)


Попробуй сначала сам ответить, а потом смотри разбор.


Часть 1. Списки
a = [1, 2, 3]
b = a

a += [4, 5]

print(a)
print(b)


Что происходит по шагам:

a = [1, 2, 3]


Переменная a ссылается на список [1, 2, 3].

b = a
Теперь b ссылается на тот же самый список, что и a.
Не копия, а один и тот же объект в памяти.

a += [4, 5]
Важно: для списков += работает как изменение объекта на месте:
это примерно то же самое, что:

a.extend([4, 5])


То есть в существующий список, на который ссылаются и a, и b, добавляются элементы 4 и 5.

Поэтому:

print(a) # [1, 2, 3, 4, 5]
print(b) # [1, 2, 3, 4, 5]


Оба указывают на один изменённый список.

Часть 2. Кортежи
a = (1, 2, 3)
b = a

a += (4, 5)

print(a)
print(b)


Кортежи неизменяемы, и здесь начинается магия.

a = (1, 2, 3)
a ссылается на кортеж (1, 2, 3).

b = a
b ссылается на тот же кортеж (1, 2, 3).

a += (4, 5)
Для кортежей += уже не может менять объект на месте (они immutable).
Поэтому Python делает так:

a = a + (4, 5)


То есть создаётся новый кортеж (1, 2, 3, 4, 5) и переменная a переназначается на него.

b при этом остаётся смотреть на старый кортеж (1, 2, 3).

Поэтому:

print(a) # (1, 2, 3, 4, 5)
print(b) # (1, 2, 3)

В чём хитрость

Для списка a += [4, 5] мутирует объект на месте, и это видно через все переменные, которые на него ссылаются.

Для кортежа a += (4, 5) создаёт новый объект и переназначает только a.

Итого:


# Часть со списком:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

# Часть с кортежем:
(1, 2, 3, 4, 5)
(1, 2, 3)


Если хочешь, могу ещё один хитрый вопрос разобрать - про изменяемые значения по умолчанию в аргументах функции или про циклы и замыкания.
👍74