Vamos na aula de hoje conversar sobre algo pouco mais conceitual, que é a forma como os objetos são armazenados na memória e o que são as variáveis relação a isso. A gente pode pensar que os objetos são dados, estruturas de dados que a gente quer armazenar e funções que vão manipular esses dados, não é? Mas esses dados precisam ser armazenados na memória do computador. E o que é a memória do computador? A gente pode pensar que é uma sequência muito longa de bytes, não é? Onde cada byte, ele é composto por oito bits. O bit é algo que representa uma informação booleana, que pode ser zero ou e o byte vai ter oito bits, então pode representar números de zero até dois elevado a oito menos que é de zero a 255. Então a nossa memória vai ter milhões ou às vezes bilhões desses bytes, onde a gente vai armazenar os dados dos objetos. Então, quando a gente cria novo objeto, o sistema de Python vai alocar pedaço da memória, reservar pedaço da memória para armazenar esse objeto e tipicamente a gente vai guardar esse objeto numa variável. Essa variável, na verdade ela é uma referência. Ela tem como se fosse apontador, ela tem o endereço de memória no qual aquele objeto está armazenado. Então vamos falar pouco sobre esses objetos e as suas referências, na aula de hoje. Então, quando eu venho no meu interpretador Python e faço a é igual a banana, ele vai criar na memória novo objeto do tipo string e vai guardar lá os bytes correspondentes a banana. Cada letra tem código. Então ele vai precisar de alguns bytes para guardar a palavra banana e vai registrar que aquilo é uma string. E daí na variável "a" ele vai armazenar qual é o endereço de memória onde está armazenada essa variável banana. Então quando eu digito o "a" aqui, ele vai naquele pedaço de memória, pega o conteúdo, vê, essa é uma string, então esses bytes correspondem a essas letras e daí ele mostra aqui a letra banana. Então o "a" é como se fosse uma referência, apontador ali para uma posição de memória onde aquele dado está armazenado. Se eu faço também aqui "b" recebe banana, eu estou criando uma nova variável e tem novo conteúdo. Nesse caso, o conteúdo é exatamente o mesmo. Se eu criasse "c" aqui com uma maçã, o conteúdo seria diferente, então com certeza essa maçã estaria armazenada num lugar diferente da banana. Mas no caso da banana, como a gente está lidando com strings, aí tem uma característica da linguagem Python: string é objeto é imutável, você não pode pegar e mudar pedaço do string. Você não pode falar: eu quero mudar o n ali por j. Não pode, porque Python strings são imutáveis. Como o Python tem essa característica, quando a gente faz "a" recebe banana e "b" recebe banana, o que internamente o sistema faz não é algo desse tipo, mas sim tanto o "a" quanto "b" vão apontar para o mesmo pedaço da memória, onde vai ter aquele objeto banana por o objeto ser imutável. Mas nem todo tipo de objeto é imutável. Então strings são imutáveis e números inteiros, os números são imutáveis também. Então o número sete, ele é o número sete, ele não vai mudar. Então se tiver duas variáveis com conteúdo sete, é o mesmo sete. Já outras coisas podem mudar. Por exemplo listas você, elas são mutáveis, você pode alterar o conteúdo de uma lista. Daí o que você teria é algo desse tipo aqui. Mas com strings é algo desse tipo. Então particular a gente pode perguntar se a is b. Aqui esse comando is, ele disse: ambas as referências estão apontando para o mesmo objeto e nesse caso ele vai dizer que, tanto a quanto b, se referem ao mesmo objeto, então a é b, porque o a e a banana. Já o a is c, obviamente não, porque o a está apontando para uma banana e o c, para uma maçã. Hã, mas vamos ver listas, eu falei listas são mutáveis, não é? Então se eu tenho a, por exemplo, vamos supor que a é uma lista 81, 82, 83 e o b é uma outra lista, mas com o mesmo conteúdo 81, 82, 83. Daí nesse caso o que vai acontecer é algo semelhante a isso. Ele vai armazenar lugares diferentes da memória, que vai ser alguma coisa como isso, está? Então o a vai apontar para uma lista, o b vai apontar para outra lista. Só que o conteúdo é o mesmo: o conteúdo é o 81, 82, 83. Então ambas as listas apontam para o mesmo conteúdo. Para confirmar isso a gente pode perguntar: a is b? Ele vai falar que não, a e b são duas, dois objetos diferentes. Mas se eu perguntar: a é igual a b? Esse comando igual-igual, ele vai fazer uma comparação do conteúdo e ele vai ver que o conteúdo é idêntico: são três elementos e é o 81, 82, 83. Então o conteúdo aqui é o mesmo, mas são objetos diferentes. Então tem esse comando a is b. Esse comando is, que permite ver se duas referências, duas variáveis apontam para o mesmo objeto, se é o mesmo objeto que a gente está querendo falar e o igual-igual, comparação é ele vai ver se os conteúdos dos objetos são iguais, está? Vamos complicar pouco mais. Você está achando que está muito simples, vamos complicar pouco mais. Vamos ver o que acontece relação a repetições e referências. Então, repetições e referências. A gente viu que a gente pode criar uma nova lista usando repetições de listas e é isso o que a gente vai fazer aqui. Vamos supor então que eu tenha uma lista original, que eu vou chamar de origlist, que ela contém os seguinte valores: 45, 76, 34 e 55, está? E se eu fizer origlist vezes 3, ele vai fazer uma lista assim, comprida. Agora se eu fizer aqui origlist vezes 3, o quê que eu fiz? Eu coloquei esse origlist dentro de uma lista, então ele criou aqui uma lista de listas. Então é uma lista grande composta de três listas dentro dela. Eu vou guardar essa, isso numa variável chamada newlist. A newlist recebe origlist vezes 3, não é? Então o newlist é essa lista de listas. O quê que acontece agora, se eu quiser alterar alguns elementos, num pedaço disso? Então eu tenho algo desse tipo. Então eu tenho a minha lista original, que tem esses elementos: 45, 76, 34, 55 e a nova lista tem 3 elementos. Cada dos elementos é uma referência para essa origlist. Então eu vou ter a origlist aqui, é, repetida três vezes dentro dela mais cada, são três elementos os três têm referências ali iguais, para uma mesma origlist, é isso o que eu tenho. Agora o quê que acontece se eu fizer origlist na minha lista original na posição 1, eu coloco ali, altero eu coloco o número 99 ali? O que será que acontece? Vamos ver: é o origlist. Simplesmente a gente sabe que vai na segunda posição ali, vai aparecer o 99, não é? Mas o quê que aconteceu com a newlist? Então note que, todas as segundas posições aqui, o 99 foi alterado. E por quê que acontece isso? Se a gente pensar, foi esse 76 aqui que foi alterado. Então o 76 deixou, esse elemento aqui do origlist deixou de apontar para esse 76 e passou a apontar para o novo elemento que é o 99. Só que o newlist aqui são três apontadores para o mesmo lugar, três referências para o mesmo lugar. Então aqui o 99 acaba aparecendo para a gente três vezes aqui nessas três posições. Então eu sei que isso aí pode dar pouco de confusão na cabeça, mas experimente praticar pouco, crie as suas listas, experimente criar uma lista de listas, alterar o valor, criar apelidos, alias para essas listas. Então brinque pouquinho com isso que você vai consolidar esses conceitos de objetos e referências. As referências a gente armazena nas variáveis. e como essas repetições aí de listas são influenciadas por essas referências e como os elementos de uma lista na verdade são referências para outros objetos e eventualmente a gente pode ter caso que dois elementos de uma lista estão apontando para o mesmo objeto, como a gente acabou vendo nesse exemplo aqui. Os três elementos da lista estão apontados para o mesmo objeto. Então, se você muda o objeto, vai acabar mudando três vezes ali nessa lista de cima aqui nessa newlist. Então é isso. [MÚSICA] Então eu vou cortar de novo, eu vou começar de novo aqui do playlist do Fábio. [MÚSICA] [INAUDÍVEL] Eu vou ter que cortar de novo. Eu vou, não, [MÚSICA] não foi isso. Ei, já errei de novo. Para, vai ter que parar. [RISADA] [MÚSICA] Eu não entendi o que aconteceu.