1

タイトルの内容の例:

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

これは何に使われますか?それはどのように機能し、いつ使用しますか?

私の考えでは、これにより、3 番目の項目の値を 1 番目と 2 番目の項目に割り当てることができます。それであれば、無限の数の変数をネストできます。

4

3 に答える 3

8

これは連鎖割り当てです。と の両方を の戻り値に設定sizeself.sizeますself.GetClientSize()

割り当てを放棄して連鎖させることができます:

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

右側の式のみが 1 回評価され、その値がすべての左側の変数に左から右に割り当てられることに注意してください。

これは、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

RHS の値を同じステートメント内の 2 つの変数に代入する場合。

a = b = 2

a と b の両方に 2 が含まれています。

これは、変数を作成したいときに使用できますalias。値を代入したばかりです。その値を 2 つの異なる方法で使用したい場合があるためです。

于 2012-09-29T19:46:55.640 に答える
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 に答える