Python vars вложенное назначение

Пример того, что говорит название:

#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 .

Если вы хотите присвоить значение RHS двум переменным в одном и том же выражении.

 a = b = 2 

Оба a и b содержат 2 ..

Это можно использовать, когда вы хотите создать alias для своей переменной, вам просто присвоено значение, потому что вы можете использовать это значение двумя разными способами.

Это примерно эквивалентно

 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=at=9 print at, b 

отпечатки 5 9

Interesting Posts