Потому что string - это набор байт.
Если вы попробуете в питоновском шелле написать эту строку на windows и linux, то получите разный результат:
ActivePython 2.7.2.5 (ActiveState Software Inc.) based on Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'фыв'.decode('latin1').__repr__()
u'\xe4\xeb\xa2'
>>>
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'фыв'.decode('latin1').__repr__()
u'\xd1\x84\xd1\x8b\xd0\xb2'
>>>
Все дело в том, что python берет кодировку из sys.stdin.encoding, и сохраняет введенный текст как набор байтов используя эту кодировку. В моём случае это было cp866 (на windows), utf-8 (на linux):
>>> print u'фыв'.encode('cp866').__repr__()
'\xe4\xeb\xa2'
>>> print u'фыв'.encode('utf-8').__repr__()
'\xd1\x84\xd1\x8b\xd0\xb2'
>>>
Т.е., когда вы делает:
По факту происходит примерно следующие:
Windows:
>>> print sys.stdin.encoding
cp866
>>> u'фыв'.encode(sys.stdin.encoding).decode('latin1')
u'\xe4\xeb\xa2'
>>>
Linux:
>>> print sys.stdin.encoding
UTF-8
>>> u'фыв'.encode(sys.stdin.encoding).decode('latin1')
u'\xd1\x84\xd1\x8b\xd0\xb2'
>>> u'фыв'.encode(sys.stdin.encoding).decode('utf-8')
u'\u0444\u044b\u0432'
>>>
Немного сумбурно, но думаю идея ясна