1

标题谈论的一个例子:

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

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

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

4

3 回答 3

8

这是一个链式分配。您将size和都设置self.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.

于 2012-09-29T19:46:38.993 回答
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

于 2012-09-29T19:59:53.473 回答
0

当您想将 RHS 上的值分配给同一语句中的两个变量时..

a = b = 2

a 和 b 都包含 2..

当您想alias为您的变量创建一个值时,可以使用它,您刚刚为其分配了值,因为您可能想以两种不同的方式使用该值..

于 2012-09-29T19:46:55.640 回答