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 — и посмотрите, что изменится.
👍125🔥4



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: |

Clear Telegram has announced a number of measures aiming to tackle the spread of disinformation through its platform in Brazil. These features are part of an agreement between the platform and the country's authorities ahead of the elections in October. The initiatives announced by Perekopsky include monitoring the content in groups. According to the executive, posts identified as lacking context or as containing false information will be flagged as a potential source of disinformation. The content is then forwarded to Telegram's fact-checking channels for analysis and subsequent publication of verified information. How to Create a Private or Public Channel on Telegram? Matt Hussey, editorial director of NEAR Protocol (and former editor-in-chief of Decrypt) responded to the news of the Telegram group with “#meIRL.”
from us


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