Python的瓦尔嵌套分配(Python vars nested assignment)

2019-10-17 06:31发布

什么关于标题会谈的一个例子:

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

这是什么用的呢? 它是如何工作的,并使用它的时候?

我的想法是,这允许指定的第三个项目的第一和第二的价值......如果是这样的话,我们可以嵌套瓦尔无限多的。

Answer 1:

这是一个链接分配。 你们都设置sizeself.size到的返回值self.GetClientSize()

你可以链分配与放弃:

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

需要注意的是在右边的表达只计算一次,它的价值被分配到由左到右的所有左边的变量。

这可以很容易地看出,如果你反编译蟒蛇字节码:

>>> 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



Answer 2:

当你想在同一个语句的RHS值分配给两个变量..

a = b = 2

a和b都包含2 ..

这可以当你想创建一个使用alias为您的变量,你刚分配的价值,因为可能要使用该值以两种不同的方式..



Answer 3:

这大致相当于

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



文章来源: Python vars nested assignment