2

私は変数の階層を持っています。

a.b.c.d1
a.b.c.d2
a.b.c.d3
a.b.c.d4

今、私はそれらをすべてローカル名前空間に入れたいと思っています:

d1=2
d2=3
...

どうすればそれを達成できますか?

4

2 に答える 2

2

objectPython では、オブジェクトが新しいスタイルのクラスである限り、つまりクラスが を直接的または間接的に継承している限り、オブジェクトのすべてのフィールドに dict のような方法で実際にアクセスできます。

@unutbu が提案したように、階層を 1 つのレベルに減らしましょう。次に、解決策は次のようになります。

class A(object):
    d0 = 0
    def __init__(self):
        self.d1 = 1
        self.d2 = 2
        self.d3 = 3
        self.d4 = 4

a = A()

for k in a.__dict__:
    print k, a.__dict__[k]
    globals()[k] = a.__dict__[k]

print d1, d2, d3, d4
print d0

これにより、次の出力が得られます。

d4 4
d2 2
d3 3
d1 1
1 2 3 4
Traceback (most recent call last):
  File "/../stackoverflow/14267654.py", line 24, in <module>
    print d0
NameError: name 'd0' is not defined

つまり、新しいスタイルのクラスのインスタンス変数はa.__dict__、特別なフィールドを介してアクセスできます。グローバル変数は、 によって返されるディクショナリに設定できますglobals()。これらを組み合わせれば、ソリューションが完成します。

于 2013-01-10T22:41:40.003 に答える
1

あなたは定義することができます

d1 = a.b.c.d1
d2 = a.b.c.d2

しかし、のような割り当て

d1 = 2

ローカル変数d1にのみ影響し、には影響しませんa.b.c.d1

割り当てに影響を与える場合はa.b.c.d1

c = a.b.c
c.d1 = 2

のような裸の変数名だけでそれを行う方法はありませんd1

于 2013-01-10T21:35:56.433 に答える