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 acomo uma "variável" e começar a pensar nela como um "nome".
a,, be cnã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 Smallse Chris Wallacetiver um cachorro quente. Se você alterar o primeiro elemento de apara 1, os primeiros elementos de be csão 1.
Se você quiser saber se dois nomes estão nomeando o mesmo objeto, use o isoperador:
>>> 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 eao valor 4. Isso não afeta os nomes de de fforma 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 idfunção, que fornece um número único que representa a identidade de um objeto, para ver exatamente qual objeto é qual, mesmo quando isnã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 ae bainda estão nomeando o mesmo objeto.
Nos bastidores, a[0]=1está 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 ints são imutáveis. Em ambos os casos, você pode religar apara um valor diferente (por exemplo, a = "Now I'm a string!"), mas a não afetará o valor original, que be cainda 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 be cos nomes bserão , agora b [1, 2, 3, 4]. Não há como mudar o valor 10para qualquer outra coisa. 10tem 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,bec,para todos apontam para o mesmo valor (neste caso uma lista), ou você quera=0,b=3ec=5. Nesse caso, você quera,b,c = [0,3,5]ou apenasa,b,c = 0,3,5.