【问题标题】:Python vars nested assignmentPython vars 嵌套赋值
【发布时间】:2012-09-29 19:45:18
【问题描述】:

标题所讲内容的示例:

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

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

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

【问题讨论】:

标签: python variable-assignment variables


【解决方案1】:

这是一个链式分配。您将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 中。

【讨论】:

  • 现在看起来很整洁,用dis来解释是个好主意。
  • 令人惊讶的是,作业是从左到右进行的,而不是从右到左。
  • 我不知道这个dis >
【解决方案2】:

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

a = b = 2

a 和 b 都包含 2..

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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 2013-03-31
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2020-01-11
      • 2017-03-18
      相关资源
      最近更新 更多