PYTHON_JOB_INTERVIEW Telegram 1107
🐍 Задача на внимательность и глубокое понимание Python: ловушка `defaultdict` и мутабельных объектов

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

Вы решаете использовать collections.defaultdict(list) для удобства, и пишете такой код:


from collections import defaultdict

actions = defaultdict(list)

def track(user_id, action):
actions[user_id].append(action)

track('alice', 'login')
track('bob', 'view')
track('alice', 'logout')

# Теперь вы хотите скопировать этот словарь
copy_actions = actions.copy()

# Допишем в оригинал
track('bob', 'logout')

# Посмотрим, как выглядит копия
print(copy_actions['bob']) # Что будет напечатано?


🧠 Вопрос:
Что будет напечатано? Почему?
Как сделать так, чтобы copy_actions не изменился при добавлении новых действий в actions?

💥 Подвох
Метод copy() копирует только верхний уровень словаря. То есть, списки значений не копируются — это всё те же самые объекты в памяти. Поэтому при track('bob', 'logout') список actions['bob'] изменяется, и это тот же самый список, что лежит в copy_actions['bob'].

➡️ Ответ: print(copy_actions['bob']) напечатает ['view', 'logout'].

Как правильно?
Чтобы избежать такой проблемы, используйте глубокое копирование:


import copy

copy_actions = copy.deepcopy(actions)


Теперь copy_actions не изменится при дальнейшем редактировании actions.

📌 Вывод
Даже опытные разработчики иногда забывают: copy() не копирует вложенные структуры данных!
Если в значениях словаря лежат мутабельные объекты, обязательно подумайте — а не нужен ли вам deepcopy()?

🧪 Попробуйте изменить defaultdict(list) на обычный dict — и посмотрите, что изменится.



tgoop.com/python_job_interview/1107
Create:
Last Update:

🐍 Задача на внимательность и глубокое понимание Python: ловушка `defaultdict` и мутабельных объектов

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

Вы решаете использовать collections.defaultdict(list) для удобства, и пишете такой код:


from collections import defaultdict

actions = defaultdict(list)

def track(user_id, action):
actions[user_id].append(action)

track('alice', 'login')
track('bob', 'view')
track('alice', 'logout')

# Теперь вы хотите скопировать этот словарь
copy_actions = actions.copy()

# Допишем в оригинал
track('bob', 'logout')

# Посмотрим, как выглядит копия
print(copy_actions['bob']) # Что будет напечатано?


🧠 Вопрос:
Что будет напечатано? Почему?
Как сделать так, чтобы copy_actions не изменился при добавлении новых действий в actions?

💥 Подвох
Метод copy() копирует только верхний уровень словаря. То есть, списки значений не копируются — это всё те же самые объекты в памяти. Поэтому при track('bob', 'logout') список actions['bob'] изменяется, и это тот же самый список, что лежит в copy_actions['bob'].

➡️ Ответ: print(copy_actions['bob']) напечатает ['view', 'logout'].

Как правильно?
Чтобы избежать такой проблемы, используйте глубокое копирование:


import copy

copy_actions = copy.deepcopy(actions)


Теперь copy_actions не изменится при дальнейшем редактировании actions.

📌 Вывод
Даже опытные разработчики иногда забывают: copy() не копирует вложенные структуры данных!
Если в значениях словаря лежат мутабельные объекты, обязательно подумайте — а не нужен ли вам deepcopy()?

🧪 Попробуйте изменить defaultdict(list) на обычный dict — и посмотрите, что изменится.

BY Python вопросы с собеседований


Share with your friend now:
tgoop.com/python_job_interview/1107

View MORE
Open in Telegram


Telegram News

Date: |

Telegram channels fall into two types: Click “Save” ; To upload a logo, click the Menu icon and select “Manage Channel.” In a new window, hit the Camera icon. Telegram Channels requirements & features The channel also called on people to turn out for illegal assemblies and listed the things that participants should bring along with them, showing prior planning was in the works for riots. The messages also incited people to hurl toxic gas bombs at police and MTR stations, he added.
from us


Telegram Python вопросы с собеседований
FROM American