web-dev-qa-db-ja.com

動的変数名を使用して一度に複数の変数を割り当てる

私は複数の変数を一度に複数の値に割り当てることができることを知っています:

(foo, bar, baz) = 1, 2, 3

そして、foo = 1、bar = 2などです。

しかし、どうすれば変数の名前をより動的にすることができますか?つまり、

somefunction(data,tupleofnames):
    (return that each name mapped to a single datum)

somefunction((1,2,3),(foo,bar,baz))     

そして、同じですか?

20
mikemaccana

これはどう?

def somefunction(data, tupleofnames):
    length = len(tupleofnames)
    for i in range(0, length):
        globals()[tupleofnames[i]] = data[i]

ここでは、dataとtupleofnamesの両方がリストであり、tupleofnamesが文字列のリストであると想定しています。しかし、トーマスが述べたように、これは良い習慣ではありません。アプリを簡単に破損させる可能性があります。

10
freakish

それを行う方法はいくつかありますが、それらは良い方法ではなく、Pythonでは悪い習慣と見なされています。新しい変数は魔法で作成されるべきではありません。もののコレクションが必要な場合は、必要に応じてリスト、辞書、またはセットを使用してください。

たとえば、辞書を返すことができます:{"foo":1, "bar":2, "baz":3}

13
Thomas K

辞書が必要なものでない場合は、おそらくnamedtupleが適切です。名前付き属性を使用して、グループ化されたデータの複数のインスタンスを効率的に作成できます。

http://docs.python.org/library/collections.html#collections.namedtuple

from collections import namedtuple


mytype = namedtuple("mytype", "foo bar baz")

a = mytype(1,2,3)
a.foo
1
a.bar
2
a.baz
 3
6
jsbueno

あなたはこのようにそれを行うことができます:

    (foo, bar, baz) = (1, 2, 3)
5

Zip&mapのヘルプドキュメントを確認してください。例えばZipの場合:-

>>>  Zip( (1,2,3) , ('foo','bar','baz') )
[(1, 'foo'), (2, 'bar'), (3, 'baz')] 

mapは、シーケンスを一緒にマップする関数を必要とします。ただし、関数の代わりにNoneを使用して、上記のZipと同じ結果を返すことができます。

>>> map( None, (1,2,3) , ('foo','bar','baz') )                                                                                       
[(1, 'foo'), (2, 'bar'), (3, 'baz')]
3
Alex Leach