Получи случайную криптовалюту за регистрацию!

Что распечатает код: def f(x,l=[]): for i in range(x): | Python вопросы с собеседований

Что распечатает код:

def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)

f(2)
f(3,[3,2,1])
f(3)

Ответ

[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
Почему?

Первый вызов функции волне очевиден, цикл добавляет 0, а затем 1 в пустой список. l – имя переменной которая указывает на список, хранящийся в памяти. Второй вызов начинается с создания нового списка, хранящегося в новом блоке памяти. l ссылается на новый список. Затем добавляются 0, 1 и 4 к новому списку. В третьем вызове функции происходит что-то странное. Она использует исходный список, хранящийся в исходной области памяти. Именно поэтому он начинается с 0 и 1.

Протестируйте следующий код, для понимания:

l_mem = []

l = l_mem # первый вызов
for i in range(2):
l.append(i*i)

print(l) # [0, 1]

l = [3,2,1] # второй вызов
for i in range(3):
l.append(i*i)

print(l) # [3, 2, 1, 0, 1, 4]

l = l_mem # третий вызов
for i in range(3):
l.append(i*i)

print(l) # [0, 1, 0, 1, 4]


@python_job_interview