Иногда нужно поменять содержимое двух списков местами так, чтобы ссылки на них остались прежними.
То есть объекты остаются теми же, а данные — полностью меняются.
Создайте функцию 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 и наоборот. Основная цель задачи, показать что присвоение списков работает не так, как присвоение простых переменных.
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. Мы их не трогали? Мы же обмен делали между копиями.
Скорее всего вас смущает то, что происходит в этой строчке a[:], b[:] = b[:], a[:]
Одна из базовых проблем изучения программирования через python заключается в том, что он очень ловко маскирует понятия указателя и содержимого ячеек памяти.
Дело в том, что срезы ведут себя очень по-разному в зависимости от того, где срез используется относительно знака присвоения.
В случае, когда он находится справа — создается новый объект в памяти (копия среза). В случае когда он находится слева — срез указывает условно на область памяти куда нужно записать данные. При этом новый объект не создается, а модифицируется текущий.
Надеюсь, стало понятнее.