Передача аргумента типа списка в функцию в 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 не определяет локальные входные аргументы при вызове функции повторно?

0 ответов

Другие вопросы по тегам