Se você está vindo para o Python a partir de uma linguagem no C / Java / etc. família, pode ajudar você a parar de pensar a
como uma "variável" e começar a pensar nela como um "nome".
a
,, b
e c
não são variáveis diferentes com valores iguais; são nomes diferentes para o mesmo valor idêntico. Variáveis têm tipos, identidades, endereços e todos os tipos de coisas assim.
Os nomes não têm nada disso. Os valores , é claro, e você pode ter muitos nomes para o mesmo valor.
Se você der Notorious B.I.G.
um cachorro quente, * Biggie Smalls
e Chris Wallace
tiver um cachorro quente. Se você alterar o primeiro elemento de a
para 1, os primeiros elementos de b
e c
são 1.
Se você quiser saber se dois nomes estão nomeando o mesmo objeto, use o is
operador:
>>> a=b=c=[0,3,5]
>>> a is b
True
Você então pergunta:
o que é diferente disso?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Aqui, você está religando o nome e
ao valor 4
. Isso não afeta os nomes d
e de f
forma alguma.
Na sua versão anterior, você estava atribuindo a a[0]
, e não a a
. Então, do ponto de vista de a[0]
, você está religando a[0]
, mas do ponto de vista a
, você está alterando isso no local.
Você pode usar a id
função, que fornece um número único que representa a identidade de um objeto, para ver exatamente qual objeto é qual, mesmo quando is
não pode ajudar:
>>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120
>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216
Observe que a[0]
foi alterado de 4297261120 para 4297261216 - agora é um nome para um valor diferente. E b[0]
agora também é um nome para esse mesmo novo valor. Isso porque a
e b
ainda estão nomeando o mesmo objeto.
Nos bastidores, a[0]=1
está realmente chamando um método no objeto de lista. (É equivalente a a.__setitem__(0, 1)
.) Portanto, não está realmente religando nada. É como ligar my_object.set_something(1)
. Claro, provavelmente o objeto está religando um atributo de instância para implementar esse método, mas não é isso que é importante; o importante é que você não está atribuindo nada, apenas está mudando o objeto. E é o mesmo com a[0]=1
.
user570826 perguntou:
E se tivermos, a = b = c = 10
É exatamente a mesma situação que a = b = c = [1, 2, 3]
: você tem três nomes para o mesmo valor.
Mas neste caso, o valor é um int
, e int
s são imutáveis. Em ambos os casos, você pode religar a
para um valor diferente (por exemplo, a = "Now I'm a string!"
), mas a não afetará o valor original, que b
e c
ainda será nomes para. A diferença é que, com uma lista, você pode alterar o valor [1, 2, 3]
em [1, 2, 3, 4]
fazendo, por exemplo, a.append(4)
; já que isso está realmente alterando o valor para o qual os nomes b
e c
os nomes b
serão , agora b [1, 2, 3, 4]
. Não há como mudar o valor 10
para qualquer outra coisa. 10
tem 10 para sempre, assim como Claudia, a vampira, tem 5 para sempre (pelo menos até que ela seja substituída por Kirsten Dunst).
* Aviso: não dê um cachorro-quente ao Notorious BIG. Os zumbis do gangsta rap nunca devem ser alimentados depois da meia-noite.
a
,b
ec,
para todos apontam para o mesmo valor (neste caso uma lista), ou você quera=0
,b=3
ec=5
. Nesse caso, você quera,b,c = [0,3,5]
ou apenasa,b,c = 0,3,5
.