Tentei usar várias atribuições, como mostrado abaixo, para inicializar variáveis, mas fiquei confuso com o comportamento, espero reatribuir a lista de valores separadamente, quero dizer b [0] ec [0] igual a 0 como antes.
a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)
O resultado é: [1, 3, 5] [1, 3, 5] [1, 3, 5]
Isso está correto? o que devo usar para várias tarefas? o que é diferente disso?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
resultado: ('f:', 3) ('e:', 4)
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
.Respostas:
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
ec
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
eChris Wallace
tiver um cachorro quente. Se você alterar o primeiro elemento dea
para 1, os primeiros elementos deb
ec
são 1.Se você quiser saber se dois nomes estão nomeando o mesmo objeto, use o
is
operador:Você então pergunta:
Aqui, você está religando o nome
e
ao valor4
. Isso não afeta os nomesd
e def
forma alguma.Na sua versão anterior, você estava atribuindo a
a[0]
, e não aa
. Então, do ponto de vista dea[0]
, você está religandoa[0]
, mas do ponto de vistaa
, 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 quandois
não pode ajudar:Observe que
a[0]
foi alterado de 4297261120 para 4297261216 - agora é um nome para um valor diferente. Eb[0]
agora também é um nome para esse mesmo novo valor. Isso porquea
eb
ainda estão nomeando o mesmo objeto.Nos bastidores,
a[0]=1
está realmente chamando um método no objeto de lista. (É equivalente aa.__setitem__(0, 1)
.) Portanto, não está realmente religando nada. É como ligarmy_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 coma[0]=1
.user570826 perguntou:
É 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
, eint
s são imutáveis. Em ambos os casos, você pode religara
para um valor diferente (por exemplo,a = "Now I'm a string!"
), mas a não afetará o valor original, queb
ec
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 nomesb
ec
os nomesb
serão , agora b[1, 2, 3, 4]
. Não há como mudar o valor10
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.
fonte
have, a = b = c = 10;
e quando tentamos atualizar o valor de b, ele efetua outro? embora eu verifiquei seus IDs são os mesmos.10
é imutável - isso significa que não há como atualizar o valor; portanto, sua pergunta não faz sentido. Você pode apontarb
para um valor diferente, mas isso não afetaa
ec
, que ainda apontam para o valor original. A diferença que as listas fazem é que elas são mutáveis - por exemplo, você podeappend
acessar uma lista oulst[0] = 3
, e isso atualizará o valor, que será visível em todos os nomes desse valor.COF cof
fonte
a,b,c = 1,2,3
sem colchetes funciona em Python 2 ou 3, se você realmente deseja esse cm extra de legibilidade.Sim, esse é o comportamento esperado. a, bec estão todos definidos como rótulos para a mesma lista. Se você quiser três listas diferentes, precisará atribuí-las individualmente. Você pode repetir a lista explícita ou usar uma das várias maneiras de copiar uma lista:
As instruções de atribuição no Python não copiam objetos - elas vinculam o nome a um objeto, e um objeto pode ter tantos rótulos quanto você definir. Na sua primeira edição, alterando a [0], você está atualizando um elemento da lista única a que a, b e c se referem. No segundo, alterando e, você está mudando e para ser um rótulo para um objeto diferente (4 em vez de 3).
fonte
Em python, tudo é um objeto, também tipos de variáveis "simples" (int, float, etc.).
Quando você altera um valor de variável, na verdade altera o ponteiro e, se você comparar entre duas variáveis, ele compara os ponteiros . (Para deixar claro, ponteiro é o endereço na memória física do computador em que uma variável está armazenada).
Como resultado, quando você altera um valor de variável interna, altera seu valor na memória e afeta todas as variáveis que apontam para esse endereço.
Para seu exemplo, quando você faz:
Isso significa que aeb apontam para o mesmo endereço na memória que contém o valor 5, mas quando você faz:
Isso não afeta b porque a agora aponta para outro local da memória que contém 6 eb ainda aponta para o endereço da memória que contém 5.
Mas quando você faz:
aeb, novamente, aponta para o mesmo local, mas a diferença é que, se você alterar um dos valores da lista:
Altera o valor da memória em que a aponta, mas a ainda aponta para o mesmo endereço que b e, como resultado, b também muda.
fonte
PyObject
. Isso não é verdade em outras implementações como PyPy ou Jython. (Na verdade, não é mesmo claro como isso poderia ser verdade, porque as línguas essas implementações são escritos em nem sequer têm ponteiros.)Você pode usar
id(name)
para verificar se dois nomes representam o mesmo objeto:Listas são mutáveis; isso significa que você pode alterar o valor no local sem criar um novo objeto. No entanto, depende de como você altera o valor:
Se você atribuir uma nova lista para
a
, em seguida, seu id vai mudar, por isso não vai afetarb
ec
de valores:Os números inteiros são imutáveis, portanto você não pode alterar o valor sem criar um novo objeto:
fonte
id
não é necessariamente um local de memória. Como dizem os documentos , isso retorna a "identidade ... um número inteiro ... que é garantido como único e constante para esse objeto durante sua vida útil". O CPython usa o endereço de memória como oid
, mas outras implementações do Python podem não. PyPy, por exemplo, não. E dizer "dois vars apontam para o mesmo local de memória" é enganoso para quem entende o estilo C. "Dois nomes para o mesmo objeto" é mais preciso e menos enganoso.no seu primeiro exemplo,
a = b = c = [1, 2, 3]
você está realmente dizendo:Se você deseja definir 'a' igual a 1, 'b' igual a '2' e 'c' igual a 3, tente o seguinte:
Espero que isto ajude!
fonte
Simplificando, no primeiro caso, você está atribuindo vários nomes a a
list
. Apenas uma cópia da lista é criada na memória e todos os nomes se referem a esse local. Portanto, alterar a lista usando qualquer um dos nomes modificará a lista na memória.No segundo caso, várias cópias do mesmo valor são criadas na memória. Portanto, cada cópia é independente uma da outra.
fonte
O que você precisa é este:
fonte
O código que faz o que eu preciso poderia ser este:
Resultado:
fonte