Python vars嵌套赋值

时间:2012-09-29 19:45:18

标签: python variable-assignment variables

标题谈论的一个例子:

#seen in a demo of PyOpenGL
# http://PyOpenGL.sourceforge.net/
size = self.size = self.GetClientSize()

这是用来做什么的?它是如何工作的以及何时使用它?

我的想法是允许将第三个项目的值分配给第一个和第二个......如果是这样,我们可以嵌套无数个变量。

3 个答案:

答案 0 :(得分:8)

这是一个链式任务。您将sizeself.size都设置为self.GetClientSize()的返回值。

您可以放弃链接作业:

>>> foo = bar = spam = eggs = 'frobnicators'
>>> foo
'frobnicators'
>>> bar, spam, eggs
('frobnicators', 'frobnicators', 'frobnicators')

请注意,右侧的表达式仅计算一次,并且它的值从左到右分配给所有左侧变量。

如果您反编译python字节码,则最容易看到:

>>> import dis
>>> def foo():
...     bar = baz = eggs = 'spam'
... 
>>> dis.dis(foo)
  2           0 LOAD_CONST               1 ('spam')
              3 DUP_TOP             
              4 STORE_FAST               0 (bar)
              7 DUP_TOP             
              8 STORE_FAST               1 (baz)
             11 STORE_FAST               2 (eggs)
             14 LOAD_CONST               0 (None)
             17 RETURN_VALUE        

DUP_TOP创建对堆栈上的值的额外引用(spam),该值存储在bar中,然后baz被赋予另一个重复引用,然后值存储在eggs

答案 1 :(得分:0)

如果要将RHS上的值分配给同一语句中的两个变量..

a = b = 2

a和b都包含2 ..

当您想为变量创建alias时,可以使用此选项,只需将值赋给,因为您可能希望以两种不同的方式使用该值。

答案 2 :(得分:0)

大致相当于

temp=self.GetClientSize()
size=temp
self.size=temp
del temp

但它执行速度更快,通常比这种形式更容易阅读。请注意,它与

不同
self.size=self.GetClientSize()
size=self.getClientSize()

执行self.getClientSize()2次,与

相同
self.size=self.GetClientSize()
size=self.size

观察

class test(object):
    def setter(self, val):
        self._t=val
    def getter(self):
        return 5
    t=property(fget=getter,fset=setter)

a=test()
b=a.t=9
print a.t, b

打印5 9