Python globals()函数输出差异疑问:变量显值函数显内存地址?
为什么globals()里变量显示字符串字面量,函数显示内存地址?
这个问题问得很有意思!其实本质上是Python处理不同对象的字符串表示方式的差异在搞鬼,咱们一步步拆解清楚:
1. 字典打印时默认调用对象的repr()方法
当你打印globals()返回的字典时,Python会对字典里的每一个值调用repr()函数来生成它的字符串表示,而不是我们平时用print()单独输出对象时默认调用的str()。这是因为字典的__str__方法设计目标是输出可复现的内容——也就是理论上可以通过eval()把这个输出还原成原来的字典,所以必须用更“精确”的repr()。
2. 不同对象的repr()实现逻辑不同
- 字符串等基础数据对象:
repr()会返回带引号的字符串形式(比如repr("This is a variable.")会得到"'This is a variable.'"),所以你在globals()的输出里看到的就是类似字符串字面量的样子,直观又符合可复现的要求。 - 函数对象:函数是更复杂的可调用对象,没法用一个简单的字面量来表示它的全部信息。Python给函数的
repr()实现是返回它的类型、名称以及内存地址(比如<function my_func at 0x7f9b1c0a1040>),内存地址是区分不同函数实例的唯一标识,这样能清晰告诉你这是哪个函数对象。
3. 动手验证一下
你可以自己跑几行代码确认这个逻辑:
my_var = "This is a variable." def my_func(): pass # 看字符串的repr和str区别 print(repr(my_var)) # 输出: 'This is a variable.' print(str(my_var)) # 输出: This is a variable. # 看函数的repr和str区别 print(repr(my_func)) # 输出: <function my_func at 0x...> print(str(my_func)) # 输出: <function my_func at 0x...>(函数的str和repr是一样的) # 打印globals(),会看到my_var是带引号的,my_func是内存地址格式 print(globals())
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

