São bools do Python passados ??por valor?
-
18-09-2019 - |
Pergunta
Enviei uma referência a um objeto bool, e eu modifiquei-lo dentro de um método. Após o método terminou a sua execução, o valor do bool fora do método não foi alterada.
Isso me leva a crer que bools do Python são passados ??por valor. Isso é verdade? Que outros tipos de Python se comportar dessa maneira?
Solução
variáveis ??em Python não são "referências" no sentido C ++. Em vez disso, eles são simplesmente nomes locais ligadas a um objeto em algum local arbitrário na memória. Se esse objeto é a própria mutável, muda a ele será visível em outros âmbitos que se ligaram um nome para o objeto. Muitos tipos primitivos (incluindo bool
, int
, str
e tuple
) são imutável no entanto. Você não pode mudar o seu valor no local; em vez disso, você atribuir um novo valor para o mesmo nome em seu escopo local.
Na verdade, quase todo o tempo * você ver o código do foo = X
forma, isso significa que o nome foo
está sendo atribuído um novo valor (X
) dentro de sua atual namespace local, não que uma localização na memória nomeado por foo
está tendo seu ponteiro interno atualizado para se referir ao invés para o local do X
.
* -. A única exceção a isso em Python é métodos setter para propriedades, que podem permitem que você escreva obj.foo = X
e tê-lo reescrito em segundo plano para, em vez chamar um método como obj.setFoo(X)
Outras dicas
Depende se o objeto é mutável ou imutável. objetos imutáveis ??se comportam como se viu com o bool, enquanto que objetos mutáveis ??vai mudar.
Para referência: http://www.testingreflections.com/node/view/5126
Python passa referências-a-objetos de valor (como Java), e tudo em Python é um objeto. Isso parece simples, mas então você vai notar que alguns tipos de dados parecem passar por valor exibem características, enquanto outros parecem agir como pass-by-reference ... qual é o problema?
É importante compreender objetos mutáveis ??e imutáveis. Alguns objetos, como cordas, tuplas e números, são imutáveis. Alterá-los dentro de uma função / método irá criar uma nova instância e a instância original fora da função / método não é alterado. Outros objetos, como listas e dicionários são mutáveis, o que significa que você pode alterar o objeto no local. Assim, alterando um objecto dentro de uma função / método irá também alterar o exterior objecto original.
A coisa a lembrar é que não há não maneira em Python para uma função ou um método para religar um nome no namespace chamando. Quando você escreve "Enviei uma referência a um objeto bool, e eu modificado dentro de um método", o que você realmente fez (eu estou supondo) foi religar o nome do parâmetro (para o qual o valor bool foi obrigado pela chamada) dentro o corpo do método.
Em suma, não há variáveis ??em Python ; há objetos (como verdadeiro e falso, os bools acontecer de ser imutável), e nomes. Os nomes são o que você chama variáveis, mas os nomes pertencem a um escopo, você normalmente não pode alterar outras do que os nomes locais nomes.