Isso é bom conta da passagem por referência. Isso não completamente explícito no python como em outras linguagens, mas existem duas formas de passar um valor a um método: passagem por valor e por referência.
Ao passar o valor estamos enviando uma cópia do valor para dentro da função. Ex:
def soma(a, b):
return a+b
numero1 = 3
numero2 = 5
print(soma(numero1, numero2)) # Exibirá o retorno da função, 8
Nesse caso acima os parametros a,b recebem os valores 3 e 5. Foram passados os valores.
Na passagem por referência é enviado o endereço de memória onde numero1 e numero2 estão. Isso significa que ao alteramos a e b dentro da função estamos alterando no endereço de memória, ou seja, no mesmo lugar que numero1 e numero2 estão. As estruturas não primitivas são passadas por referência automaticamente, como listas, dicionários e objetos (há outras). As estruturas primitivas, como string, int ou float são passados por valor.
Estrutura primitiva é aquela que possui um item do tipo dela. Ex: Uma variável inteira possui um inteiro dentro. Uma do tipo string possui uma string dentro.
Estrutura não primitiva é aquela que quebra isso. Ex: Um dicionário pode possuir inteiros, string, float, lista e até outros dicionários. Uma lista pode ser de inteiros, strings ou ambos.
Na linguagem C isso é mais explícito com a ideia de ponteiros. Vou deixar aqui links sobre o tema em python e também em C para você poder ler um pouco.
https://www.guj.com.br/t/funcao-de-python-altera-variavel-fora-de-seu-escopo/343819/3
https://acervolima.com/passe-por-referencia-vs-valor-em-python/
http://linguagemc.com.br/ponteiros-em-c/
Se ficar algumas dúvida, pode comentar aqui que tento melhorar a explicação!
Até!