Разберём каждый блок кода и его поведение:
@pytest.fixture(scope="session")
Разберём каждый блок кода и его поведение:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
@pytest.fixture(scope="session") def a(): return [1, 2]
def test_one(a): a.append(3)
def test_two(a): print(len(a))
Ответ
Разберём каждый блок кода и его поведение:
a = [1, 2, 3]
b = a
b.append(4)
print(a) # [1, 2, 3, 4]
print(a is b) # True
Списки — изменяемые объекты. Переменные a и b ссылаются на один и тот же объект. Изменение через b отражается в a. Оператор is показывает, что это один и тот же объект.
a = 10
b = a
print(a is b) # True (для малых целых чисел в Python)
b += 5
print(a) # 10
print(b) # 15
Целые числа — неизменяемые объекты. При b += 5 создаётся новый объект, b теперь ссылается на 15, а a остаётся 10. is для малых чисел может быть True из-за интернирования.
data = {
([1, 2, 3]): "a",
(1, 2, 3): "b"
}
print(data)
Ключи словаря должны быть хешируемыми. Список [1,2,3] — изменяемый и не хешируемый объект, поэтому будет ошибка TypeError: unhashable type: 'list'. Кортеж (1,2,3) — хешируемый, поэтому допустим.
a = (1, [2, 3])
a[1].append(4)
print(a) # (1, [2, 3, 4])
Кортеж — неизменяемый объект, но если внутри есть изменяемые объекты (например, список), их содержимое можно менять. Здесь список внутри кортежа изменяется.
a = [1, 2, 2, 3]
b = set(a)
print(len(a), len(b)) # 4 3
Множество (set) содержит только уникальные элементы. В списке 4 элемента, в множестве — 3 уникальных.
Итог: важно понимать различия между изменяемыми и неизменяемыми объектами, ссылочной и значимой семантикой, а также требования к ключам словаря.