🐍 Python-задача с подвохом: что напечатает код?
def extend_list(val, lst=[]):
lst.append(val)
return lst
list1 = extend_list(10)
list2 = extend_list(123, [])
list3 = extend_list('a')
print("list1 =", list1)
print("list2 =", list2)
print("list3 =", list3)
Варианты ответа:
1️⃣
list1 = [10]
, list2 = [123]
, list3 = ['a']
2️⃣
list1 = [10]
, list2 = [123]
, list3 = [10, 'a']
3️⃣
list1 = [10, 'a']
, list2 = [123]
, list3 = [10, 'a']
4️⃣
list1 = [10, 'a']
, list2 = [123]
, list3 = ['a']
---
💡 Подсказка:
Если вы используете изменяемый объект (например, список) как значение по умолчанию в аргументе функции — он сохраняется между вызовами.
---
✅ Ответ:
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']
🔎 Почему?
👉 Значение по умолчанию
lst=[]
создаётся один раз — при определении функции. 👉 Когда вызываем
extend_list(10)
, значение 10
добавляется в этот общий список. 👉 Когда вызываем
extend_list(123, [])
, передаём новый список, всё ок. 👉 Когда вызываем
extend_list('a')
, снова используется общий список из первого вызова.Чтобы избежать этой ловушки:
def extend_list(val, lst=None):
if lst is None:
lst = []
lst.append(val)
return lst
🚀 Запомни: никогда не используй изменяемые объекты как значения по умолчанию для аргументов функции!
@python_job_interview
>>Click here to continue<<