Python動的変数名の定義と呼び出し方法

4074 ワード

動的変数名付与tkinterを使用する場合、動的生成var 1などの変数を動的に生成する必要があります.var 10変数.
execダイナミック割り当ての使用execpython 3には、pythonコードの動的実行をサポートする内蔵関数です.
例:

In [1]: for i in range(5):
  ...:   exec('var{} = {}'.format(i, i))
  ...:

In [2]: print(var0, var1, var2, var3 ,var4)
0 1 2 3 4

ネーミングスペースによる動的割り当て
Pythonのネーミングスペースでは、変数名と値を辞書に格納し、locals()globals()関数でローカルネーミングスペースとグローバルネーミングスペースをそれぞれ取得できます.

>>> names = locals()
>>> for i in range(5):
...   names['n' + str(i) ] = i
...
>>> print(n0, n1, n2, n3, n4)
0 1 2 3 4
>>>

クラスでの動的変数の使用
Pythonのクラスオブジェクトの属性は、の__dict__に格納されます._dict__ は辞書で、キーは属性名で、値は属性の値に対応します.

>>> print(n0, n1, n2, n3, n4)
0 1 2 3 4
>>> class Test_class(object):
...   def __init__(self):
...     names = self.__dict__
...     for i in range(5):
...       names['n' + str(i)] = i
...
>>> t = Test_class()
>>> print(t.n0, t.n1, t.n2, t.n3, t.n4)
0 1 2 3 4

動的変数の呼び出し
実際、重複性の変数については、var 0、var 1、var 2、var 3、var 4などの変数を呼び出すことは一般的ではない.varNは、次の方法で変数を動的に呼び出すことができます.
まず、次の変数を定義します.

>>> for i in range(5):
...   exec('var{} = {}'.format(i, i))
...
>>> print(var0, var1, var2, var3 ,var4)
0 1 2 3 4

exec関数の使用
同様に、exec変数を呼び出すことができる

In [3]: for i in range(5):
  ...:   exec('print(var{}, end=" ")'.format(i))
  ...:
0 1 2 3 4

ネーミングスペースの活用
コマンド空間のlocals()globals()はいずれも辞書を返すので、辞書のgetメソッドで変数の値を取得する

In [4]: names = locals()

In [5]: for i in range(5):
  ...:  print(names.get('var' + str(i)), end=' ')
  ...:
0 1 2 3 4

以下は他のネットユーザーの補足です.
Python動的変数の定義
問題の説明
データ処理をする時、いくつかグループ化して得たデータに対して、した操作は大同小異で、変数の命名もすべて同じ構造を持って、例えば毎月のデータに対して平均値、分散などの統計量を求めて、変数の命名は“n月の平均値”、“n月の分散”と取ることができて、抽象的に“n月の'm統計量”です
プログラミング実装の際には,上記変数の定義や参照を共に実装することで,重複コードの数を減らすことができる.
実装時に動的に変数を定義する問題に遭遇したが,ここでまとめてみる.
execによる変数の動的定義
変数をこのように動的に定義できます

for n in range(1, 13):
   exec('month_{} = {}'.format(n, value or expression))

一般に、この文は変数を正しく定義できますが、後方から入力されたexpressionがDataFrameGroupクラス変数を返すと、構文エラーが発生することがあります.
  File "", line 1     month_12 =                ^ SyntaxError: invalid syntax
原因は不明...検索してみると、上記の問題を解決する別の定義方法があることがわかりました.

for n in range(1, 13):
   exec('month_{} = temp'.format(n), {'temp': expression})

この方法には2つの問題があります.
1、formatで置換する部分は変数名の最後に、例month_{},こそ実行に成功するが,{}monthは実行できません.原因は調べなければなりません.皆さんに教えてください.
File "", line 1     12_month = temp       ^ SyntaxError: invalid token
2、この方法で定義された変数は、execでのみ有効であり、exec文の外では無効である.これはpythonがexecの複雑な命令を局所変数としているためか、以下の文で検証できる

for n in range(1, 13):
   exec('month_{} = temp
print(locals()==globals())'.format(n), {'temp': expression})

ここでlocals()とglobals()はpythonの内部メソッドであり、辞書ベースのローカル変数とグローバル変数へのアクセス方法を提供します.
Trueを返すと、現在の環境がグローバルレベルであることを示し、execの文はexecの外で有効になります.
Falseを返すと、当期環境がローカルレベルにあることを示し、定義された変数はローカル変数とみなされるため、execでは外注できず、文にglobals()を入力してグローバルに有効にすることができます.

for n in range(1, 13):
   exec('month_{} = temp'.format(n), {'temp': expression}, globals())
exec方式が混乱しやすく、変数を動的に定義するもう一つの方法は、前述のglobals()とlocals()の方法である
ネーミングスペースを使用した変数の動的定義
まずlocals()のコピーを作成します
varDict = locals()
上記の変数については、このように定義できます.

for n in range(1, 13):
  varDict['month_'+str(n)] = value or expression

この方法で作成した変数は、最初の方法で文法エラーと変数の役割ドメインのエラーは発生しません.推奨します.