That's because of pythons interpreter optimization at UNPACK_SEQUENCE
time, during loading the constant values. When python encounters an iterable during the unpacking, it doesn't load the duplicate objects multiple times, instead it just keeps the first object and assigns all your duplicate variable names to one pointer (In CPython implementation). Therefore, all your variables will become same references to one object. At python level you can think of this behavior as using a dictionary as the namespace which doesn't keep duplicate keys.
In other words, your unpacking would be equivalent to following command:
a = b = 257
And about the negative numbers, in python 2.X it doesn't make any difference but in python 3.X it seems that for numbers smaller than -5 python will create new object during unpacking:
>>> a, b = -6, -6
>>> a is b
False
>>> a, b = -5, -5
>>>
>>> a is b
True