S. Обмен содержимым

Иногда нужно поменять содержимое двух списков местами так, чтобы ссылки на них остались прежними.
То есть объекты остаются теми же, а данные — полностью меняются.
Создайте функцию swap(a, b), которая принимает два списка и меняет их содержимое местами.
Результат должен быть виден во всех переменных, которые ссылаются на эти списки.

Примечание

Ваше решение должно содержать только функции.
В решении не должно быть вызовов требуемых функций.

Пример

Ввод

a = b = [1, 2]
c = d = [2, 1]
print(a, b, c, d)
swap(a, c)
print(a, b, c, d)

Вывод

[1, 2] [1, 2] [2, 1] [2, 1]
[2, 1] [2, 1] [1, 2] [1, 2]

Решение

Яндекс рекомендует использовать срезы, и с этой подсказкой задача становится слишком простой. Усложнить ее можно лишь, если вы не знаете, что можно написать такой срез — a[:]. Но если вы знаете, то все становится слишком просто.

Есть более «наивные» методы решения:
1) Методы copy(), clear(), extend()
2) Поэлементный обмен через цикл

Посмотреть код

Решение

Python
def swap(a, b):
    a[:], b[:] = b[:], a[:]

Решение

Python
def swap(a, b):
    temp = a.copy()
    a.clear()
    a.extend(b)
    b.clear()
    b.extend(temp)

Решение

Python
def swap(a, b):
    min_len = min(len(a), len(b))
    for i in range(min_len):
        a[i], b[i] = b[i], a[i]
    temp_a = a[min_len:].copy()
    temp_b = b[min_len:].copy()
    a[min_len:] = temp_b
    b[min_len:] = temp_a
Подписаться
Уведомить о
guest
4 комментариев
Старые
Новые Популярные
Анна
Анна
03.11.2025 18:49

Мое решение, конечно, кривое. Но суть в том, что VS code выдает верный результат, а компилятор яндекс контеста нет. В чем тут может быть проблема?

zadacha
Дмитрий
Дмитрий
01.07.2026 12:56

a = b = [1, 2]
c = d = [2, 1]
def swap(a, b):
  a[:], b[:] = b[:], a[:]
swap(a, c)
print(a, b, c, d)

Здравствуйте, подскажите такой момент, не могу суть уловить.
Мы же сделали здесь срез, он создал копию массива. И вот мы в копию а положили копию b. Так а почему вызвав print мы получаем измененные массивы? Они же те же самые a, b, c, d. Мы их не трогали? Мы же обмен делали между копиями.

Последний раз редактировалось 20 дней назад Дмитрий ем