是否可以在另一个变量的赋值中分配变量?

时间:2013-06-25 02:38:31

标签: python variable-assignment

我有两个问题:

1)我想写一个如下语句:superVar = [subVar1 = 'a', subVar2 = 'b']

在此声明之后,我想要:

superVar = ['a', 'b']

subVar1 = 'a'

subVar2 = 'b'

这在python中是否可以实现?

2)我想在类的 init 函数中执行以下操作:

self.superVar = [v1 = 'a', v2 = 'b']

在此声明之后,我想要:

self.superVar = ['a', 'b']

self.superVar.v1 = 'a'

self.superVar.v2 = 'b'

即。让'superVar'成为其他变量名称的一部分。

你可能已经猜到了,我真正想做的是上面的(2)。 (1)只是第一步,如果(2)不可能,我会很高兴。

非常感谢! 拉夫

5 个答案:

答案 0 :(得分:3)

>>> from collections import namedtuple
>>> T = namedtuple('supervar', ['v1', 'v2'])
>>> superVar = T('a', 'b')
>>> superVar.v1
'a'
>>> superVar.v2
'b'

答案 1 :(得分:2)

你的意思是字典吗?

superVar = {'subVar1': 'a', 'subVar2': 'b'}
superVar['subVar1']
# 'a'
superVar['subVar2']
# 'b'

在课堂上:

class Foo(object):
    def __init__(self, a, b):
        self.superVar = {'subVar1' : a, 'subVar2' : b}


bar = Foo('one', 'two')
bar.superVar.values()
# ['one', 'two']

如果您想保留订单,可以使用收藏模块中的ordered dictionary

答案 2 :(得分:2)

在Python中,赋值是语句,而不是表达式。您不能将语句链接在一起。所以(1)是不可能的 但是,您可以在类的__init__方法中使用keyword arguments来获取(2)中的行为:

>>> class Test:
        def __init__(self, **kwargs):
            print "the keyword arguments are", kwargs #kwargs is a dictionary
            for x in kwargs:
                setattr(self, x, kwargs[x]) #adds an attribute from kwargs to self

>>> t = Test(var1=1234,var2='hello',var3=45.234)
the keyword arguments are {'var1': 1234, 'var3': 45.234, 'var2': 'hello'}
>>> t.var1
1234
>>> t.var2
'hello'
>>> t.var3
45.234
>>> 

答案 3 :(得分:2)

为什么不为subVar创建字典并使superVar成为subVar字典中的值列表?

d = {'subVar1': 'value1', 'subVar2': 'value2'}
superVar = d.values()

答案 4 :(得分:1)

这与Jeremy Bentham的答案基本相同,

class T:

    def __init__(self):
        self.SuperVar = {'v1':'a', 'v2':'b'}
        print self.SuperVar.v1
        print self.SuperVar.v2

    def __setattr__(self, k, v):

        class SuperVar:
            def __setattr__(self, k, v):
                self.__dict__[k] = v

        if k == "SuperVar":
            self.__dict__["SuperVar"] = SuperVar()
            for k in v:
                self.__dict__["SuperVar"].__setattr__(k, v[k])
        else:
            self.__dict__[k] = v


t = T()