A explicação vem da diferença entre objetos mutáveis e imutáveis e o
fato que em Python não funcionam os conceitos de "passar por valor" ou
"passar por referência" como em C, mas sim a ideia de atribuir rótulos
para objetos (mutáveis ou imutáveis)
Achei esse artigo aqui bem escrito[1] e aborda sucintamente a questão.
Acho que o importante é entender a diferença entre esses três
snippets:
>>> a = "spam"
>>> def foo(param):
>>> param = "eggs"
>>> print(a)
"spam"
>>> a = ["spam"]
>>> def bar(param):
>>> param = ["eggs"']
>>> print(a)
["spam"]
>>> a = ["spam"]
>>> def baz(param):
>>> param[0] = ["eggs"']
>>> print(a)
["eggs"]
Nos três, ao chamar a função atribuímos o rótulo param para os objetos
"spam" no primeiro caso e para ["spam"] no segundo e terceiro, o mesmo
objeto referenciado por a no escopo anterior.
Mas nos dois primeiros, nós mudamos o objeto referenciado pelo rótulo
param, para "eggs" no primeiro caso e para ["eggs"] no segundo, e em
ambos o rótulo param deixa de referenciar o objeto referenciado pelo
rótulo a.
No terceiro caso, o rótulo param continua apontando para o objeto
referenciado por a, e alteramos uma propriedade desse objeto. Podemos
fazer isso porque o objeto em questão é uma lista, mutável portanto.
Leandro
[1]
http://www.jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/
2014-01-27 Henrique Cesar Ulbrich <
henrique...@gmail.com>:
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo
> "garoa-python" dos Grupos do Google.
> Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie
> um e-mail para
garoa-python...@googlegroups.com.
> Visite este grupo em
http://groups.google.com/group/garoa-python.