E aí [Música] o Olá pessoal bem-vindos a nossa disciplina de algoritmos e programação de computadores dois para Univesp Eu sou professor Marcelo Manzato Eu Vou conduzir essa disciplina com vocês é essa disciplina é uma continuação da que a gente viu no bimestre passado que foi algoritmos e programação de computadores um é naquela disciplina a gente aprender os conceitos básicos de algoritmos implementando eles na linguagem Python e essa disciplina né que a gente vai começar agora é uma continuação como eu falei onde a gente vai ver é conceitos um pouco mais avançados da linguagem Python e
entre outros conceitos também e a ideia que vocês possam aprofundar né o nascimento de vocês em programação é aplicando esses conhecimentos que a gente viu não no bimestre passado em aplicações um pouco mais específicas e vendo né alguns nós alguns conceitos mais é importantes né que é que vai vão ser necessários à para vocês ao longo do do curso né de engenharia não só de computação como outras engenharias e que a ideia é que vocês possam né Depois nas penas futuras aprofundar o estudo de vocês é nesses outros conselhos e é para quem não me
conhece eu sou professor Marcelo Manzato sou professor do Instituto de Ciências Matemáticas e computação da USP campus de São Carlos eu tenho experiência há mais de 10 anos no ensino de programação e computação sou formado né em computação pela Universidade Estadual de Londrina com o mestrado e doutorado em computação pela Universidade de São Paulo e para mim vai ser um prazer né ministrar essa disciplina assim como foi né do bimestre passado e espero que vocês tenham Bom proveito dela Tá bom então a gente vai começar essa primeira aula é com uma uma visão um pouco
mais aprofundada dos tipos mutáveis em e não mutáveis da linguagem parto então isso daqui e pessoal faz parte da parte de gerenciamento de memória que é esse primeiro tema que a gente vai ver aí neste da sua primeira semana da disciplina a gente chegou a ver alguma coisa né do bimestre passado sobre tipos mutáveis e não mutáveis mas essa vídeo-aula né de hoje é para a gente realmente se aprofundar um pouco mais em como que isso funciona na no gerenciamento de memória que partam realiza a por meio né da ao longo da execução dos programas
bom então como eu falei para vocês até o bimestre passado a gente aprendeu os conceitos básicos de programação o E sendo que o funcionamento interno das operações é não foi apresentado em muitos detalhes né naquela disciplina porque vocês tavam realmente aprendendo a programar estavam preocupados com outros conceitos mais básicos de algoritmos e só que aí então neste bimestre a gente vai aprofundar nosso estudo né e programação é começando com essa parte aqui de gerenciamento de memória na linguagem Python Tá bom então vamos lá né quando a gente faz uma atribuição é de uma um valor
para uma variável é a linguagem Python cria para gente um objeto a esse objeto todos os objetos na linguagem partam partam né É só formadas por duas informações básicas que é o tipo e o valor que está armazenado então o isso depende o tipo depende do valor que é atribuído a uma variável naquele momento então quando a gente faz uma atribuição como essa daqui é a recebe três o valor três é interpretado pela linguagem como um tipo int não é um inteiro então é criada criado um objeto na memória e esse objeto tem como o
tipo o Wind né e o valor de eu já tô recebe o literal três é E aí a linguagem Python a Mantena mesmo não mantém uma tabela com todos os nomes de variáveis que são criadas pelo programa então a variável a vai ser armazenada nessa tabela e E aí essas variáveis elas apontam num determinado momento para um objeto que está alocado lá na memória bom Então olha só aqui um exemplo eu faço uma uma atribuição do valor três para a variável o ar então a variável né o nome ah é é colocado numa tabela né
de discagem né de variáveis lá no pela pela linguagem Python e essa variável a aponta para esse objeto do tipo int que tem o valor três que é exatamente isso que tá aqui então o valor prestar-lhe armazenado aí você tem o tipo ali dentro também armazenado né um outro exemplo B recebe 3.0 esse ponto zero significa que ele vai criar um tipo flute é que é diferente do inte3 Netão 3.0 ele vai é criar um e também com o valor três só que é do tipo flute então ele armazena também o as casas decimais depois
eu tenho mais uma declaração de uma variável você que recebe uma string Hello é às vezes tem ninguém sem na linguagem partam é são criadas por meio das aspas que podem ser simples ou duplas E então é a mesma coisa né é colocada nessa tabela a variável e essa variável aponta para o objeto na memória que tem o tipo stringhi que é o STR né e o o valor Hello e por fim mais um outro exemplo aqui onde eu crio uma variável de com um objeto do tipo list e esse esse objeto tem como o
valor essa lista aqui desse conjunto de elementos tá Oi como que tá aqui embaixo ó essa aqui vai estar na memória são escada quadradinho desse cinza é um objeto e cada objeto tem um tipo e um valor ali dentro beleza Tá bom mas aí eu posso perguntar para vocês o que que acontece quando eu altero a variável a né então eu tenho eu tinha o apontando para o objeto com o valor três do tipo int aí eu faço a recebe Seis e que vai acontecer acontece pessoal aqui ele vai criar um outro objeto na memória
do tipo em também só que aí ele vai né vai ser com o valor seis desta vez tá E aí como o Ele tava apontando para o objeto anterior com o valor valor três Esse é essa variável a agora aponta para o novo objeto que foi criado então reparem que a setinha aqui né de apontamento ela tá agora apontando para o outro objeto então isso significa que os tipo o tipo int neste caso ele é não mutável quer Oi primo tava então aquele objeto que foi criado anteriormente com o valor três esse valor não é
alterado para aquele objeto específico se você quer fazer uma nova atribuição de um outro valor para uma variável é que que tava contado anteriormente para um inte é ele vai entrar na mente Nelo na memória vai criar um outro objeto e vai fazer com aquela variável aponta para esse novo objeto mesma coisa se eu fizesse após isso a recebe sete isso vai fazer com que ele também crê um outro objeto do tipo int é com o valor 7 ela dentro e aí esse esse a esse e esse apontamento né da variável o a vai agora
para o Sérgio tá então ele vai atualizar esta variável então é concluindo os tipos 20 Bubble Fruit estr e complexão tipos imutáveis quando você cria um objeto contendo um valor na específico desse de um desses tipos fazendo alguma alteração é nessa nessa no valor dessa variável você tá na verdade criando um outro objeto tá é diferente do Dali está do tipo list que é essa daqui ó ela ela é diferente por isso que não tá aqui né então a gente vai ver daqui a pouco aí como que funciona com as listas então enche booleano a
for his Strings e Complex são tipos e mutáveis bom então vamos ver como que funciona para tipos mutáveis que é no caso das listas tá então no caso de lista o seu valor pode alterar tão reparem que eu faço inicialmente uma atribuição de uma lista contendo os elementos 2358 11 para a variável B que que vai acontecer na memória então eu vou ter a minha variável lá na minha tabela de variáveis e essa variável vai apontar para um objeto do tipo lista é que vai ter como valor os elementos né das tá lista 2 3
5 8 e 11 bom E se eu fizer algo como isso daqui ó desde três recebe 7 quer dizer eu estou alterando o quarto elemento desta lista é que que vai acontecer lá na naquele objeto list que foi criado ele vai fazer alteração daquele elemento então como eu estou alterando o quarto elemento seria isso aqui né esse elemento é um de 8 ele passa para sete tá então reparem que aquele objeto o lixo que foi criado anteriormente ele permanece lá na memória é o mesmo objeto é o mesmo espaço de memória Você alterou realmente o
valor dentro daquele objeto beleza Ah é Então para atribuição de variáveis no caso de variáveis do tipo int Olha só um exemplo né quando eu faço a recebe três que que vai acontecer o ar ele vai apontar para o objeto três criado lá na memória do tipo int se eu faço B recebe a eu tô fazendo com que o bebê receba o valor armazenado na variável a né então o como o valor três já estava armazenado já estava criado né o objeto int com o valor três já estava lá na memória um bocado você vai
fazer com que a variável B aponte para o mesmo endereço de memória tá então que vai ser também com aquele objeto três que está lá na memória então tanto a como o bebê vão apontar para o endereço de memória em seguida supondo que eu faço a recebe seis que que vai acontecer o a variável a vai apontar para um novo objeto com o valor seis que é esse aqui E o bebê como ele já ele tava apontando para o três ele permanece ali é apontando para que ele objeto com valor 3 que é esse daqui
tá então você vai ter dois objetos do tipo int lá na tua memória né e duas variáveis uma apontando para casa objeto Ah tá legal bom E como que é a mutabilidade dos objetos afeta atribuição de variáveis no caso de listas Então olha só eu tenho aqui uma lista criada com três elementos 3 4 e 5 atribuindo essa lista para uma variável lá que que vai acontecer na memória você vai ter a tua variável a a contando para essa lista aqui criada lá na memória do tipo lista fazendo B recebe a a mesma coisa né
do exemplo anterior você vai criar também este esta variável lá na tabela né de variáveis vai fazer com que B aponte para o mesmo endereço de memória daquele objeto criado anteriormente para o tipo lista é bom e aí o que que eu faço né se eu fizer B de um recebe oito Eu Tô operando o segundo o valor dessa lista é tão olha só aqui eu faço a impressão né ah eu faço ao interpretador me retornar o valor desta variável B estão de fato ele alterou o segundo elemento dessa lista antes vale a quatro agora
valeu oito porque eu fiz essa atribuição tá aqui e reparem que se eu quiser consultar o conteúdo da variável a reparem que ele também me retornou a lista alterada tão reparem que apesar de eu ter criado a lista de atribuído ela inicialmente para a variável o ar eu faço alteração dessa lista por meio da variável B que essa parte que tá aqui e isso vai afetar tanto quer saber como alistar por quê Porque a mesma lista tá se você olhar aqui na memória é a mesma lista é o mesmo endereço de memória é o mesmo
objeto e você tem tantas tanto as variáveis a tanto a variável a com uma variável B apontando para esse mesmo endereço tudo bem e ir no caso de funções como que funciona Olha só eu tenho aqui a definição então de uma variável ou uma atribuição do inte3 isso aqui é o que vai acontecer na mesma hora você vai criar o objeto do tipo int com o valor três e você vai ter a tua variável a apontando para este endereço de memória tá E aí eu tenho essa definição aqui ó da função tá Por enquanto eu
não tô chamando ela simplesmente definir a função G fazendo com que o parâmetro x recebo o valor sim vamos ver o que que acontece quando eu chamo essa função passando o o argumento a bom Então olha só vou chamar GT ar tá então o que que eu vou ter lá na minha memória né é antes média executar aquela função Eu tenho esse cenário aqui ó tá então esse cenário que tá aqui é realmente durante esta esta é passada é passagem né do do interpretador lá para o escopo da função então ele ainda não executou o
conteúdo da função tá nessa passagem então e o valor de ar vai ser atribuído a x cartão x vai receber a isso internamente tá isso implicitamente lá pelo interpretador e esse e esse essa atribuição faz com que eu tenha é o aí a a contando para três e o x né que é a minha meu parâmetro está definido lá no na minha na minha função né vai também eu vou também vou ter esse x lá né como uma variável e esse x vai apontar para três também para o mesmo objeto com valor três tá bom
e aí o que que vai acontecer eu vou executar o conteúdo da função eu vou fazer com que x receba 5 e aí esse é o caso é o cenário onde vai ter a gente vai ter isso daqui o x agora ele vai a contar para um novo objeto do tipo int que vai ter o valor cinco é esse aqui ó x apontando para esse sim e reparem que o ar ele permanece apontando para o três tá ele não mudou a gente não não não afetou né o valor de ar Oi e aí então quando
voltar né dá daqui para cá tá que ele vai vir para para para baixo aqui me Após a execução da função o a variável x ela vai ser deslocada né então esse negócio aqui vai ser deslocado não vai mais existir por quê Porque eu X Ele tava no escopo da função tá E aí eu vou ter isso daqui né que eu a recebe Uai igual a 3 o aponta para três então se eu mandasse imprimir aqui ó o ar e se ele esse cara Queria imprimir três tá tão conteúdo da variável lá não vai ser
afetada Após a execução da função tá e já no caso de lista isso é diferente isso vai fazer a internação tá Então olha só eu tenho a minha definição de uma uma função H onde ela recebe uma lista essa lista eu vou fazer com que o primeiro elemento dessa lista recebo o valor cinco aqui eu tô criando a minha lista com os elementos 3 6 9 12 que é exatamente este cenário aqui né onde eu tenho my list apontando para esse objeto e aí eu vou fazer a chamada a função H nesta chamada o que
que eu vou fazer vou fazer com que lst né o lst receba o mar list tá então você vai fazer com que my list que é esse cara receba aquele objeto tá que já tava criado bom aí eu vou Executar a função H executou na função H envolve e eu pegar o nome da variado no no inciso era quer dizer o primeiro elemento recebe o valor sim então eu vou de fato alterar aquele valor Ah tá saiu da função tem que vai acontecer essa variável eles lst vai vai ser deslocada desalocando ela eu vou ainda
ter my list e esse my list vai a contar para aquele objeto e reparem que aquele objeto eu tive uma alteração naquele conteúdo tá então de três ele passou para cinco então de fato houve alteração na naquele objeto list Tá bom já estão reparem que a passagem de parâmetro acaba sendo igual né no caso de em ti e para lista é só que você tem que sempre lembrar quais tipos da linguagem Python são mutáveis e quais tipos da linguagem pais não são mutáveis Porque isso pode afetar a passagem de parâmetro de função e para no
caso de tipos que são notáveis no caso de um lista quando você passa essa lista por parâmetro para dentro da função EA função altera o conteúdo dessa lista isso vai afetar o lado de fora da função o que já não acontece para tipos não não mutáveis no caso de empate flores booleanos e etc tá bom então é isso daí Essa foi a nossa primeira vídeo aula sobre tipos mutáveis e não mutáveis na linguagem Python Ah é então espero que vocês possam ter entendido esses tipos né mutáveis e não mutáveis que envolvem esse gerenciamento de memória
e a gente se vê na próxima vídeo aula ainda dessa semana obrigado e até lá [Música]