List comprehensions [1.0 for i in [1]] and [1 for i in [1]] are on one line have the same address (address of the first listcomp code object), because their listcomp code objects are the same.
Update: As Rhomboid correctly noticed in the discussion on reddit, constants for current code object are stored in dictionary (although displayed as tuple) and the same code object constants are folded.
As hash values for [1.0 for i in [1]][0] and [1 for i in [1]][0] are the same, when addition to the dict is performed - items' values are compared using code_richcompare methods (in this way python dict resolves collisions).

And for the second one code object variables are the same, except co_consts:

co_consts = (1,)

But as 1.0 == 1, and tuples (1.0,) and (1,) are equal. Therefore Python considers the second code object as duplicate of the first one, and its address is the same. So identity operator "is" returns True for the same objects.

And that is why in Python 3 the next expressions will also be valid.

>>> a = type([1.0 for i in [1]][0]); b = type([1 for i in [1]][0])
>>> print(a, b)
>>> <class 'float'> <class 'float'>
>>> type([1 for i in [1]][0]) is type([True for i in [1]][0])
>>> True

In your example types are float and complex, because co_code for list comprehension with float/int/bool value and for list comprehension with complex value are different.For float/int/bool: b'g\x00\x00|\x00\x00]\x0c\x00}\x01\x00d\x00\x00\x91\x02\x00q\x06\x00S'But for complex: b'g\x00\x00|\x00\x00]\x0c\x00}\x01\x00d\x02\x00\x91\x02\x00q\x06\x00S'Therefore objects are not equal, although the values are:>>> 1.0 == True == 0j+1 == 1>>> True