In CPython 2.7.10 and 3.4.3, and PyPy 2.6.0 (Python 2.7.9), it is apparently legal to use expressions (or some subset of them) for the name list in a for-loop. Here's a typical for-loop:
>>> for a in [1]: pass
...
>>> a
1
But you can also use attributes from objects:
>>> class Obj(object): pass
...
>>> obj = Obj()
>>> for obj.b in [1]: pass
...
>>> obj.b
1
And you can even use attributes from expressions:
>>> for Obj().c in [1]: pass
...
But not all expressions appear to work:
>>> for (True and obj.d) in [1]: pass
...
File "<stdin>", line 1
SyntaxError: can't assign to operator
But they do so long as the attribute is on the outside?
>>> for (True and obj).e in [1]: pass
...
>>> obj.e
1
Or something is assignable?
>>> for {}['f'] in [1]: pass
...
I'm surprised any of these are legal syntax in Python. I expected only names to be allowed. Are these even supposed to work? Is this an oversight? Is this an implementation detail of CPython that PyPy happens to also implement?