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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top