Передача аргумента типа списка в функцию в Python
Я знаю, что обычно аргумент передается функциям по ссылкам. Для меня это означает, что если я передам аргумент в функцию, а внутри этой функции я изменю его, это изменение также будет применено к исходной переменной. Другими словами:
>>> l1 = [0,]
>>> def f1(l):
l[0] += 1
>>> l1
[0]
>>> f1(l1)
>>> l1
[1]
>>>
Q1: Почему неизменяемые типы действуют иначе?
>>> s1 = "0"
>>> def f2(s):
s += "1"
>>> s1
'0'
>>> f2(s1)
>>> s1
'0'
>>>
Я думаю, что если аргумент является изменяемым, он сам изменяется, в противном случае внутри метода будет создана новая переменная с тем же именем, и изменения не будут применены к внешней переменной. Я прав?
Когда я использовал аргументы со значениями по умолчанию, эти аргументы определяются в вызове функции как локальные переменные в стеке, верно? При возврате этой функции они стали недоступны.
Итак, давайте посмотрим фрагмент:
>>> def f3(i , l=list()):
l.append(i)
print l
>>> f3(1)
[1]
>>> f3(1)
[1, 1]
>>>
Q2: почему я получаю [1, 1]
вместо одного [1]
во втором звонке? Разве Python не определяет локальные входные аргументы при вызове функции повторно?