481

Python で可変変数を実現するにはどうすればよいですか?

たとえば、ここに詳細な手動エントリがあります:変数変数

これは一般的に悪い考えだと聞いていますが、これは PHP のセキュリティ ホールです。本当?

4

16 に答える 16

385

これを行うために辞書を使用できます。ディクショナリは、キーと値のストアです。

>>> dct = {'x': 1, 'y': 2, 'z': 3}
>>> dct
{'y': 2, 'x': 1, 'z': 3}
>>> dct["y"]
2

変数キー名を使用して、セキュリティ リスクなしで変数変数の効果を得ることができます。

>>> x = "spam"
>>> z = {x: "eggs"}
>>> z["spam"]
'eggs'

次のようなことを考えている場合

var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...

リストは辞書よりも適切かもしれません。リストは、オブジェクトの順序付けられたシーケンスを整数インデックスで表します。

lst = ['foo', 'bar', 'baz']
print(lst[1])           # prints bar, because indices start at 0
lst.append('potatoes')  # lst is now ['foo', 'bar', 'baz', 'potatoes']

順序付きシーケンスの場合、リストは整数キーの辞書よりも便利です。リストは、インデックス順での反復、スライスappendおよび辞書を使用した面倒なキー管理を必要とするその他の操作をサポートするためです。

于 2009-09-03T12:41:05.467 に答える
109

組み込みgetattr関数を使用して、オブジェクトの属性を名前で取得します。必要に応じて名前を変更します。

obj.spam = 'eggs'
name = 'spam'
getattr(obj, name)  # returns 'eggs'
于 2009-09-03T12:43:26.367 に答える
84

それは良い考えではありません。グローバル変数にアクセスしている場合は、globals().

>>> a = 10
>>> globals()['a']
10

ローカル スコープ内の変数にアクセスする場合は、 を使用できますlocals()が、返された辞書に値を割り当てることはできません。

より良い解決策getattrは、変数を辞書に使用または保存してから、名前でアクセスすることです。

于 2009-09-03T12:43:49.770 に答える
42

可変変数を使用したいときはいつでも、おそらく辞書を使用する方がよいでしょう。だから書く代わりに

$foo = "bar"
$$foo = "baz"

あなたが書く

mydict = {}
foo = "bar"
mydict[foo] = "baz"

このようにして、以前に存在していた変数を誤って上書きすることはなく (これはセキュリティの側面です)、異なる「名前空間」を持つことができます。

于 2009-09-03T12:42:00.103 に答える
15

辞書の代わりに collections モジュールからも使用できるためnamedtuple、アクセスが容易になります。

例えば:

# using dictionary
variables = {}
variables["first"] = 34
variables["second"] = 45
print(variables["first"], variables["second"])

# using namedtuple
Variables = namedtuple('Variables', ['first', 'second'])
vars = Variables(34, 45)
print(vars.first, vars.second)
于 2016-06-22T15:09:32.630 に答える
9

その動作を実現するにはglobals()、組み込みメソッドを使用する必要があります。

def var_of_var(k, v):
    globals()[k] = v

print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print(variable_name) # 123

some_name = 'variable_name2'
var_of_var(some_name, 456)
print(variable_name2) # 456
于 2016-06-09T12:14:11.803 に答える
8

私は質問に答えています:文字列で名前が指定された変数の値を取得する方法は? これは、この質問へのリンクを含む複製として閉じられています。

問題の変数がオブジェクトの一部(たとえば、クラスの一部)である場合、正確にそれを達成するための便利な関数は、、、hasattrおよびgetattrですsetattr

たとえば、次のようにすることができます。

class Variables(object):
    def __init__(self):
        self.foo = "initial_variable"
    def create_new_var(self,name,value):
        setattr(self,name,value)
    def get_var(self,name):
        if hasattr(self,name):
            return getattr(self,name)
        else:
            raise("Class does not have a variable named: "+name)

次に、次のことができます。

v = Variables()
v.get_var("foo")

「初期変数」

v.create_new_var(v.foo,"is actually not initial")
v.initial_variable

「実際にはイニシャルではありません」

于 2016-11-02T15:53:20.303 に答える