Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+661новая вакансия за сутки·58 731вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 712
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 393 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python11 079
  • Облачные технологии8 824
  • QA вакансии2 977
  • Android1 395
  • Инженер данных1 032
  • Продакт-менеджер351

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C++301
  • C#211

DevOps и инфраструктура

  • Kubernetes5 251
  • Linux-инфраструктура4 138
  • DevOps вакансии3 024
  • Terraform / IaC2 834
  • Мониторинг и Observability1 406
  • CI/CD917
  • SRE389
  • Кибербезопасность40

Аналитика и данные

  • Аналитик данных586
  • Бизнес-аналитик487
  • Data Scientist458
  • Системный аналитик75

Другие направления

  • Проджект-менеджер114
  • UI/UX дизайн74
  • Ручное тестирование14

По регионам

  • Вакансии в США31 201
  • Вакансии в Европе11 507
  • Работа в России3 630
  • Вакансии в Канаде2 546

По формату

  • Удалённые вакансии47 761
  • Релокация в США31 201
  • Гибридная работа7 699
  • Офисная работа6 071

По уровню

  • Senior вакансии27 027
  • Middle вакансии12 284
  • Junior вакансии4 495

Сейчас нанимают

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PythonВсе вопросы
PythonMiddleТеория

Объясните разницу между поверхностным (shallow copy) и глубоким (deep copy) копированием.

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Shallow copy создаёт новый контейнер со ссылками на те же вложенные объекты; deepcopy рекурсивно клонирует всю иерархию. Используйте deepcopy, когда копия должна быть полностью независима от оригинала.

Поверхностное копирование (shallow copy)

Создаётся новый объект-контейнер, но вложенные объекты не копируются — в новом контейнере хранятся ссылки на те же вложенные объекты, что и в оригинале.

import copy

original = [[1, 2, 3], [4, 5, 6]]
shallow = copy.copy(original)

shallow[0].append(99)  # меняем вложенный список
print(original[0])     # [1, 2, 3, 99] — оригинал тоже изменился!
print(shallow is original)   # False — разные контейнеры
print(shallow[0] is original[0])  # True — одни и те же вложенные объекты

Shallow copy и deep copy в Python

Python предоставляет два механизма копирования объектов через модуль copy: copy.copy() для поверхностного и copy.deepcopy() для глубокого копирования.

Глубокое копирование (deep copy)

Рекурсивно создаёт новые объекты для всей иерархии. Изменение любой части копии не затрагивает оригинал.

import copy

original = [[1, 2, 3], [4, 5, 6]]
deep = copy.deepcopy(original)

deep[0].append(99)
print(original[0])  # [1, 2, 3] — оригинал не изменился
print(deep[0] is original[0])  # False — разные объекты

Встроенные способы создания shallow copy

Многие встроенные типы поддерживают поверхностное копирование без импорта copy:

lst = [1, [2, 3]]

# Все три эквивалентны shallow copy для списков:
a = lst[:]
b = list(lst)
c = lst.copy()

# Для словарей:
d = {"a": [1, 2]}
d_copy = d.copy()  # shallow

# Для множеств:
s = {1, 2, 3}
s_copy = s.copy()  # shallow (но элементы множества должны быть immutable)

Когда что применять

  • Shallow copy — когда вложенные объекты иммутабельны (числа, строки, кортежи без mutable элементов) или когда намеренно нужна общая ссылка на вложенную структуру.
  • Deep copy — когда нужна полная независимость копии: конфигурационные объекты, состояние игры, дерево разбора AST.

Кастомизация поведения

Класс может контролировать оба режима через специальные методы:

import copy

class MyConfig:
    def __init__(self, data: dict, secret: str):
        self.data = data
        self._secret = secret  # не хотим копировать

    def __copy__(self):
        # shallow: новый объект, data — та же ссылка
        new = MyConfig.__new__(MyConfig)
        new.data = self.data
        new._secret = self._secret
        return new

    def __deepcopy__(self, memo: dict):
        new = MyConfig.__new__(MyConfig)
        memo[id(self)] = new
        new.data = copy.deepcopy(self.data, memo)
        new._secret = self._secret  # намеренно не копируем
        return new

cfg = MyConfig({"key": [1, 2]}, "s3cr3t")
cfg_deep = copy.deepcopy(cfg)
print(cfg.data is cfg_deep.data)  # False
print(cfg._secret is cfg_deep._secret)  # True (строки — интернированы, ок)

Подводные камни

  • Циклические ссылки: deepcopy обрабатывает их через внутренний словарь memo, но самописные рекурсивные функции копирования зависнут. Всегда передавайте memo в рекурсивных __deepcopy__.
  • Иллюзия безопасности tuple: copy.copy((list1, list2)) возвращает тот же объект кортежа (CPython оптимизация), а вложенные списки не скопированы.
  • Производительность deepcopy: на больших вложенных структурах работает значительно медленнее — профилируйте перед применением в горячих путях.
  • Не все объекты копируемы: сокеты, файловые дескрипторы, потоки, функции с замыканиями на нескопируемые ресурсы поднимут TypeError.
  • dataclasses и copy: dataclasses.replace() делает shallow copy только указанных полей — это не то же самое, что copy.copy().
  • NumPy arrays: arr.copy() всегда делает deep copy данных массива, но объектные массивы (dtype=object) содержат ссылки — нужен deepcopy.
  • pickle vs deepcopy: pickle.loads(pickle.dumps(obj)) тоже даёт deep copy, но только для pickle-сериализуемых объектов; deepcopy работает шире.

Частые вопросы на собеседовании

  • Что такое truthy и falsy значения в Python?
  • Когда использовать threading?
  • Что такое type hints и зачем они нужны?
  • Как работает yield?

Типичные ошибки

  • Описывать shallow vs deep copy только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом Python и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет shallow vs deep copy через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме Python →

Источники

  • https://docs.python.org/3/library/copy.html

Связанные темы

Pythontechnical-reasoning

Вакансии с этим навыком

Python вакансии
  • AI Enablement Lead (GenAI Value Lab) (#5686)
  • Middle DevOps (AWS) Engineer (#5857)
  • Senior MLOps Engineer (#5860)
  • Senior Data Engineer (#5883)
  • Lead Cloud Engineer (Azure) — Interview Experts Needed (#5499)