标题谈论的一个例子:
#seen in a demo of PyOpenGL
# http://PyOpenGL.sourceforge.net/
size = self.size = self.GetClientSize()
这是用来做什么的?它是如何工作的以及何时使用它?
我的想法是允许将第三个项目的值分配给第一个和第二个......如果是这样,我们可以嵌套无数个变量。
答案 0 :(得分: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
。
答案 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