首先,python这样的语言,只能做有限的"词法编址"(lexical address),不可能实现 @王加加 所说的“所有变量名函数名等名称,在转成字节码后,只是一个个地址,名称只是在写代码的时候增加可读性。”
为什么呢?因为很多动态语言使用的基本方法是“延迟绑定”(late binding)。这代表了两个意思:创建绑定的过程是动态的
在环境里寻找绑定的过程也是动态的
我也可以断言,python是不能完全避免“延迟绑定”的。
我没有用过python,也不清楚python的实现,为什么我敢如此断言呢?因为以下代码可以在python解释器里执行:
somename = input()
def a():
return 2
exec("def{}(): return 1".format(somename))
print(a())
在shell里运行效果如下:
ayanamists@DESKTOP-KBI2TVT:~$ python test.py
"a"
1
显然地,在执行之前的任何一个阶段,都不可能知道a会绑定上什么东西。
至于那位答主根据字节码给出的结果, 我在他的代码中加上一行:
import dis
def a(s):
exec("s = 0")
return s+1
dis.dis(a)
print(a(1))
结果是
ayanamists@DESKTOP-KBI2TVT:~$ python test.py
3 0 LOAD_CONST 1 ('s = 0')
3 LOAD_CONST 0 (None)
6 DUP_TOP
7 EXEC_STMT
4 8 LOAD_FAST 0 (s)
11 LOAD_CONST 2 (1)
14 BINARY_ADD
15 RETURN_VALUE
1
这反而说明解释器必须在运行时知道"s’这个标识符对应的是0号局部变量。
综上所述,python在编译成字节码时确实进行了一定的词法编址工作,把一些绑定映射为了一个“地址”,但由于无法避免某些【延迟绑定】的出现,它不可能真正地扔掉标识符,某些时候仍然需要用标识符来寻找绑定。
至于题主的问题,从上面的分析可以看出如果没有用标识符寻找绑定的过程,对性能没有任何影响
如果有,影响最大的因素也应该是【标识符编码后的长度】,当然,utf-8编码下,非ascii字符确实比ascii字符要长,不过用python这种语言的时候,根本无需纠结这点性能。
另外,有些人不喜欢用非ascii字符做标识符,这无可厚非。但标识符这东西,只要你自己、和你合作的人看得懂、看得舒服就可以。别人怎么说,不太重要。