Como realizo variáveis variáveis em Python?
Aqui está uma entrada manual elaborativa, por exemplo: Variáveis variáveis
Ouvi dizer que essa é uma má ideia em geral, e é uma falha de segurança no Python. Isso é verdade?
python
variable-variables
Taryn
fonte
fonte
Respostas:
Você pode usar dicionários para fazer isso. Dicionários são lojas de chaves e valores.
Você pode usar nomes de chaves variáveis para obter o efeito de variáveis variáveis sem o risco à segurança.
Nos casos em que você está pensando em fazer algo como
uma lista pode ser mais apropriada que um ditado. Uma lista representa uma sequência ordenada de objetos, com índices inteiros:
Para as seqüências ordenadas, listas são mais convenientes do que dicts com chaves inteiras, porque as listas apoiar iteração na ordem do índice, corte ,
append
e outras operações que exigiria o gerenciamento de chaves desajeitado com um dicionário.fonte
Use a
getattr
função interna para obter um atributo em um objeto pelo nome. Modifique o nome conforme necessário.fonte
Não é uma boa ideia. Se você estiver acessando uma variável global, poderá usar
globals()
.Se você deseja acessar uma variável no escopo local, pode usar
locals()
, mas não pode atribuir valores ao ditado retornado.Uma solução melhor é usar
getattr
ou armazenar suas variáveis em um dicionário e depois acessá-las pelo nome.fonte
x = "foo"
elocals()["x"] = "bar"
usandoprint x
fornece a saídabar
para o Jython 2.5.2. Isso foi testado com um script de automação sob demanda no maximo .Sempre que você quiser usar variáveis variáveis, provavelmente é melhor usar um dicionário. Então, ao invés de escrever
você escreve
Dessa forma, você não substituirá acidentalmente variáveis existentes anteriormente (que é o aspecto de segurança) e poderá ter "namespaces" diferentes.
fonte
Às vezes, novos codificadores escrevem código assim:
O codificador é então deixado com uma pilha de variáveis chamadas, com um esforço de codificação de O ( m * n ), onde m é o número de variáveis nomeadas e n é o número de vezes que o grupo de necessidades variáveis para ser acedido (incluindo criação ) O iniciante mais astuto observa que a única diferença em cada uma dessas linhas é um número que muda com base em uma regra e decide usar um loop. No entanto, eles ficam presos em como criar dinamicamente esses nomes de variáveis e podem tentar algo como isto:
Eles logo descobrem que isso não funciona.
Se o programa exigir "nomes" variáveis arbitrários, um dicionário é a melhor opção, conforme explicado em outras respostas. No entanto, se você está simplesmente tentando criar muitas variáveis e não se importa de se referir a elas com uma sequência de números inteiros, provavelmente está procurando por
list
. Isso é particularmente verdadeiro se seus dados forem homogêneos, como leituras diárias de temperatura, pontuações semanais de questionários ou uma grade de widgets gráficos.Isso pode ser montado da seguinte maneira:
Isso
list
também pode ser criado em uma linha com uma compreensão:Em ambos os casos, o resultado é um preenchido
list
, com o primeiro elemento acessado commy_calculator.buttons[0]
, o próximo commy_calculator.buttons[1]
e assim por diante. O nome da variável "base" torna-se o nome dolist
e o identificador variável é usado para acessá-lo.Por fim, não esqueça de outras estruturas de dados, como o
set
- isto é semelhante a um dicionário, exceto que cada "nome" não tem um valor anexado a ele. Se você simplesmente precisa de uma "bolsa" de objetos, essa pode ser uma ótima opção. Em vez de algo como isto:Você terá isso:
Use a
list
para uma sequência de objetos semelhantes,set
para uma bolsa de objetos ordenada arbitrariamente oudict
para uma bolsa de nomes com valores associados.fonte
Em vez de um dicionário, você também pode usar
namedtuple
o módulo de coleções, o que facilita o acesso.Por exemplo:
fonte
Se você não quiser usar nenhum objeto, ainda poderá usá-lo
setattr()
dentro do seu módulo atual:fonte
__dict__
variável no entanto. Gostaria de saber se existe um mecanismo geral para criar qualquer variável global dinamicamente.globals()
pode fazer issoA
SimpleNamespace
classe pode ser usada para criar novos atributos comsetattr
ou subclasseSimpleNamespace
e criar sua própria função para adicionar novos nomes de atributos (variáveis).fonte
Estou respondendo à pergunta: como obter o valor de uma variável com o nome em uma string? que é fechado como duplicado com um link para esta pergunta.
Se as variáveis em questão fazem parte de um objeto (parte de uma classe, por exemplo), em seguida, algumas funções úteis para conseguir exatamente o que são
hasattr
,getattr
esetattr
.Então, por exemplo, você pode ter:
Então você pode fazer:
fonte
Usar
globals()
Você pode realmente atribuir variáveis ao escopo global dinamicamente, por exemplo, se desejar 10 variáveis que podem ser acessadas em um escopo global
i_1
,i_2
...i_10
:Isso atribuirá 'a' a todas essas 10 variáveis, é claro que você também pode alterar o valor dinamicamente. Todas essas variáveis podem ser acessadas agora como outra variável declarada globalmente:
fonte
Você precisa usar o
globals()
método interno para obter esse comportamento:fonte
O consenso é usar um dicionário para isso - veja as outras respostas. Essa é uma boa ideia para a maioria dos casos, no entanto, existem muitos aspectos decorrentes disso:
Dito isso, implementei uma classe- manager de variáveis variáveis, que fornece algumas das idéias acima. Funciona para o python 2 e 3.
Você usaria a classe assim:
Se você deseja permitir a substituição de variáveis apenas do mesmo tipo:
fonte
Eu tentei tanto no python 3.7.3, você pode usar globals () ou vars ()
Referência:
https://www.daniweb.com/programming/software-development/threads/111526/setting-a-string-as-a-variable-name#post548936
fonte
Qualquer conjunto de variáveis também pode ser agrupado em uma classe. As variáveis "Variáveis" podem ser adicionadas à instância da classe durante o tempo de execução, acessando diretamente o dicionário interno por meio do atributo __dict__.
O código a seguir define a classe Variables, que adiciona variáveis (neste caso, atributos) à sua instância durante a construção. Os nomes de variáveis são obtidos de uma lista especificada (que, por exemplo, poderia ter sido gerada pelo código do programa):
fonte