Иногда нужно поменять содержимое двух списков местами так, чтобы ссылки на них остались прежними.
То есть объекты остаются теми же, а данные — полностью меняются.
Создайте функцию 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) Поэлементный обмен через цикл
Посмотреть код
Решение
def swap(a, b):
a[:], b[:] = b[:], a[:]Решение
def swap(a, b):
temp = a.copy()
a.clear()
a.extend(b)
b.clear()
b.extend(temp)Решение
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
Мое решение, конечно, кривое. Но суть в том, что VS code выдает верный результат, а компилятор яндекс контеста нет. В чем тут может быть проблема?
Вы зачем-то меняете порядок чисел в списке на противоположный: b[::-1]
Этого не требуется.
Кроме того, если вдруг списки будут не одинаковой длины, ваш алгоритм не сработает, потому что обмен содержимым будет изменять длину списка.
Вам нужно сделать так, чтобы содержимое списка a перекочевало в список b и наоборот. Основная цель задачи, показать что присвоение списков работает не так, как присвоение простых переменных.