是什么<function at 'somewhere'>
意思?例子:
>>> def main():
... pass
...
>>> main
<function main at 0x7f95cf42f320>
也许有一种方法可以使用0x7f95cf42f320
?
是什么<function at 'somewhere'>
意思?例子:
>>> def main():
... pass
...
>>> main
<function main at 0x7f95cf42f320>
也许有一种方法可以使用0x7f95cf42f320
?
您正在查看函数对象的默认表示。它为您提供了一个名称和一个唯一的 id,在 CPython 中恰好是一个内存地址。
您无法使用该地址访问它;内存地址仅用于帮助您区分函数对象。
换句话说,如果您有两个最初命名为 的函数对象main
,您仍然可以看到它们是不同的:
>>> def main(): pass
...
>>> foo = main
>>> def main(): pass
...
>>> foo is main
False
>>> foo
<function main at 0x1004ca500>
>>> main
<function main at 0x1005778c0>
它是函数的标识,在 CPython 实现中它是内存中对象的地址。
每个对象obj都有一个方法obj.__ repr __( )
调用时,此方法返回一个字符串对象,它是对象obj的“官方”可打印表示
当 Python 解释器遇到脚本
或命令行中的一行时,
会调用对象
的方法__repr __ ( ),并将返回的代表字符串的值显示在屏幕上。print obj
>>> obj
对象的__repr __ ( )方法具体可以通过使用内置函数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
表示对象的内存地址(这里是函数),也就是说一个整数,它引用了对象在 RAM 中的位置。
0x00FB2930
是一个hexinteger,也就是说一个以 16 为基数的表示内存地址值的文字。
该内存地址由内置函数精确返回id()
,其值打印为十进制整数文字,即以 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'>
在 CPython 中只是对象在内存中的地址。所有对象都具有此功能,而不仅仅是功能。