Python кортежи формируются запятой:
>>> class Car: pass
...
>>> c1 = Car()
>>> c2 = Car()
>>> c1, c2
(<__main__.Car instance at 0x1031fa368>, <__main__.Car instance at 0x1031fa290>)
>>> type(_) # type of the last result
<type 'tuple'>
Скобки являются опциональный здесь; вы также можете написать кортеж как (c1, c2)
.
Цикл for
просто выполняет итерацию по этому кортежу; цикл присваивает каждый элемент кортежа, чтобы obj
для этой итерации:
>>> for obj in c1, c2: print obj
...
<__main__.Car instance at 0x1031fa368>
<__main__.Car instance at 0x1031fa290>
obj
Таким образом, первый связан с Car
экземпляра c1
ссылки, а затем к одному c2
ссылок.
Таким образом, петля делает следующее: obj = c1
, затем obj = c2
и выполняет тело цикла после каждого такого назначения. Затем вызов setattr()
устанавливает атрибут, названный в строке attr
, значению, найденному в value
.
Вы имеете в виду 'для obj в c1, c2:' part? Это всего лишь петля над кортежем. –
'c1, c2' является кортежем, ваш код эквивалентен' для obj in (c1, c2): ... '. – vaultah
Вы можете найти эту статью полезной: [Факты и мифы о именах и значениях Python] (http://nedbatchelder.com/text/names.html), который был написан ветеранкой SO Нед Батчелдер. –