2013-10-12 3 views

ответ

9

Вы смотрите представление объекта функции по умолчанию. Он предоставляет вам имя и уникальный идентификатор, который в CPython принимает как адрес памяти.

У вас нет доступа к нему, используя адрес; адрес памяти используется только для того, чтобы вы могли различать объекты функции.

Другими словами, если у вас есть две функциональные объекты, которые первоначально были названы main, вы можете увидеть, что они разные:

>>> def main(): pass 
... 
>>> foo = main 
>>> def main(): pass 
... 
>>> foo is main 
False 
>>> foo 
<function main at 0x1004ca500> 
>>> main 
<function main at 0x1005778c0> 
+0

Спасибо большое !!! – JadedTuna

+0

@ Vik2015 Нет, см. [Http://stackoverflow.com/q/1396668/395760](http://stackoverflow.com/q/1396668/395760) – delnan

3

Это функция-х identity, в реализации CPython это адрес из объект в памяти.

1

В CPython это просто адрес объекта в памяти. Все объекты имеют это, а не только функции.

+0

Это относится только к CPython. – Livius

+0

@Livius Изменен. Благодарю. –

2

Каждый объект OBJ имеет метод obj.__repr__()
При вызове, этот метод возвращает объект строки, который является «официальным» для печати представление объекта OBJ

Когда интерпретатор Python встречает
строка print obj в сценарии
или >>> obj в командной строке,
Вызывается метод __repr__() объекта и значение представителя Возвращаемая строка возвращается на экран.

__ магнезия __() метода объекта конкретно можно назвать, используя встроенную функцию repr() с именем объекта в качестве аргумента, чтобы присвоить строку, возвращенную __ предста __ (), чтобы иметь возможность выполнять операции над этим представлением.
Только в Python 1 и Python 2 обратные кавычки вокруг имени объекта имеют тот же эффект, что и вызов repr().

Сравнить:

def main(): 
    pass 

if '__repr__' in dir(main): 
    print ('__repr__ is a method of main\n') 
else: 
    print ('main has no method __repr__\n') 

print ('main : %s\n' 
     'type(main) == %s\n' 
     % (main,type(main))) 

print ('repr(main) : %s\n' 
     'type(repr(main)) == %s' 
     %(repr(main),type(repr(main)))) 

# Only in Python 1 and Python 2, string conversions with 
# reversed quotes produce the same result as repr(): 
print ('\n`main` : %s\n' 
     'type(`main`) == %s' 
     % (`main`,type(`main`))) 

результат

__repr__ is a method of main 

main : <function main at 0x00FB2930> 
type(main) == <type 'function'> 

repr(main) : <function main at 0x00FB2930> 
type(repr(main)) == <type 'str'> 

.

В <function main at 0x00FB2930>, часть 0x00FB2930 представляет собой адрес памяти объекта (здесь функция), то есть в целое число, который ссылается на местоположение объекта в ОЗУ.

0x00FB2930 является hexinteger, то есть буквальным, представляющее значение адреса памяти в базе 16.

Этот адрес памяти точно, возвращенное встроенной функцией id(), значение которого выводится в виде decimalinteger буквальным, то есть свое представительство в базе 10.

print ('repr(main) : %s\n' 
     'type(repr(main)) == %s\n' 
     % (repr(main), 
      type(repr(main)))) 

hex_address = repr(main)[18:-1] 
print ('hex_address = repr(main)[18:-1] defined\n' 
     'hex_address : %s\n' 
     'type(hex_address) == %s\n' 
     'int(hex_address , 16) : %s\n' 
     'type(int(hex_address , 16)) : %s\n' 
     % (hex_address, 
      type(hex_address), 
      int(hex_address , 16), 
      type(int(hex_address , 16)))) 

print ('id(main) : %s\n' 
     'type(id(main)) == %s\n' 
     'hex(id(main) : %s\n' 
     'type(hex(id(main)) : %s' 
     % (id(main), 
      type(id(main)), 
      hex(id(main)), 
      type(hex(id(main))))) 

результата

repr(main) : <function main at 0x00FB2930> 
type(repr(main)) == <type 'str'> 

hex_address = repr(main)[18:-1] defined 
hex_address : 0x00FB2930 
type(hex_address) == <type 'str'> 
int(hex_address , 16) : 16460080 
type(int(hex_address , 16)) : <type 'int'> 

id(main) : 16460080 
type(id(main)) == <type 'int'> 
hex(id(main) : 0xfb2930 
type(hex(id(main)) : <type 'str'> 

 Смежные вопросы

  • Нет связанных вопросов^_^