标题谈论的一个例子:
#seen in a demo of PyOpenGL
# http://PyOpenGL.sourceforge.net/
size = self.size = self.GetClientSize()
这是干什么用的?它是如何工作的以及何时使用它?
我的想法是这允许将第三项的值分配给第一项和第二项……如果是这样,我们可以嵌套无限数量的变量。
标题谈论的一个例子:
#seen in a demo of PyOpenGL
# http://PyOpenGL.sourceforge.net/
size = self.size = self.GetClientSize()
这是干什么用的?它是如何工作的以及何时使用它?
我的想法是这允许将第三项的值分配给第一项和第二项……如果是这样,我们可以嵌套无限数量的变量。
这是一个链式分配。您将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
.
大致相当于
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
当您想将 RHS 上的值分配给同一语句中的两个变量时..
a = b = 2
a 和 b 都包含 2..
当您想alias
为您的变量创建一个值时,可以使用它,您刚刚为其分配了值,因为您可能想以两种不同的方式使用该值..