>>> x = 'foo'
>>> x
'foo'
Итак, имя x
прикреплено к строке 'foo'
. Когда вы вызываете, например, repr(x)
, интерпретатор помещает 'foo'
вместо x
, а затем вызывает repr('foo')
.
>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repr
фактически вызывает магический метод __repr__
в x
], который дает строку, содержащую представление значения 'foo'
, присвоенное x
. Поэтому он возвращает 'foo'
внутри строки ""
, что приводит к "'foo'"
. Идея repr
состоит в том, чтобы дать строку, содержащую ряд символов, которые мы можем ввести в интерпретаторе, и получить то же значение, которое было отправлено как аргумент repr
.
>>> eval("'foo'")
'foo'
Когда мы вызываем eval("'foo'")
, это то же самое, что мы набираем 'foo'
в интерпретаторе. Это как мы непосредственно набираем содержимое внешней строки ""
в интерпретаторе.
>>> eval('foo')
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
eval('foo')
File "<string>", line 1, in <module>
NameError: name 'foo' is not defined
Если мы назовем eval('foo')
, это то же самое, что мы набираем foo
в интерпретаторе. Но нет переменной foo
и возникает исключение.
>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>>
str
- это просто строковое представление объекта (помните, что переменная x
относится к 'foo'
), так что эта функция возвращает строку.
>>> str(5)
'5'
Строковое представление integer 5
- '5'
.
>>> str('foo')
'foo'
И строковое представление строки 'foo'
- это одна и та же строка 'foo'
.