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



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