Если a был пустым списком, b = a, а потом в a добавляется элемент, чему равно b в Python
Что проверяют
Понимаете ли вы, что переменная в Python это имя, привязанное к объекту, а не ячейка со значением. Следом почти всегда идёт вариация: а если a = a + [1], а если a += [1], а как сделать независимую копию.
Как отвечать
Ответ: b равно [1]. Присваивание b = a ничего не копирует, оно привязывает второе имя к тому же списку. a.append(1) меняет сам объект, и изменение видно через любое имя. Проверить можно так: a is b вернёт True, id(a) == id(b) тоже.
Дальше покажите, что понимаете границы правила:
a = a + [1]: создаётся новый список, и имяaперепривязывается к нему.bостаётся[];a += [1]: для списка это__iadd__, изменение на месте, какextend.bстанет[1]. Для кортежа или строки тот же+=создаёт новый объект, потому что они неизменяемы;- поверхностная копия:
a.copy(),a[:],list(a)дают новый список, но вложенные объекты остаются общими. Дляa = [[1], [2]]правкаc = a.copy(); c[0].append(3)видна и вa; - глубокая копия:
copy.deepcopy(a)рекурсивно копирует и вложенные объекты.
Та же механика объясняет две классические ловушки. Изменяемый аргумент по умолчанию def f(x=[]) создаётся один раз при определении функции и накапливает значения между вызовами. А в [[]] * 3 все три элемента это один и тот же список, и append в первый появится во всех.
Где спотыкаются
Переносят привычку из C++, где std::vector<int> b = a создаёт копию, и отвечают, что b остался пустым. В Python достаточно модели «имена и объекты», без указателей и адресов.
Считают a += [1] и a = a + [1] одним и тем же. Для списков это разное поведение, и именно его часто проверяют следующим вопросом.
Думают, что a.copy() решает всё, и получают общие вложенные списки или словари. Если внутри лежат изменяемые объекты, нужна глубокая копия или явная пересборка структуры.