python源代码 ====> python字节码 ======>运行虚拟机
1.PYTHON,CYTHON
将这两个放在一起,是因为python的标准和原始实现就是基于cython的,由于python的源代码是需要将python源码首先编译为c代码,然后再编译为本机代码的方式运行的,由于c语言和本机代码的关系,执行速度比较快。
2.JYTHON
首先将python编译为基于java字节码的字节码文件,然后在java虚拟机jvm上运行java字节码
3.IronPython
将python编译为基于.NET的CLI的中间语言文件,然后在CLR上运行。
python命名空间
对于python来说,命名空间是变量的封装,最直接的命名空间就是文件,文件是该文件中的变量的封装,每一个模块文件自动成为一个命名空间,每个模块文件都是独立完备的命名空间,文件必须明确地导入其他的文件,才可以使用这些文件的变量名。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:
>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']
而对于不可变对象,比如str,对str进行操作呢:
>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'
虽然字符串有个replace()
方法,也确实变出了'Abc'
,但变量a
最后仍是'abc'
,应该怎么理解呢?
我们先把代码改成下面这样:
>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'
要始终牢记的是,a
是变量,而'abc'
才是字符串对象!有些时候,我们经常说,对象a
的内容是'abc'
,但其实是指,a
本身是一个变量,它指向的对象的内容才是'abc'
:
┌───┐ ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘ └───────┘
当我们调用a.replace('a', 'A')
时,实际上调用方法replace
是作用在字符串对象'abc'
上的,而这个方法虽然名字叫replace
,但却没有改变字符串'abc'
的内容。相反,replace
方法创建了一个新字符串'Abc'
并返回,如果我们用变量b
指向该新字符串,就容易理解了,变量a
仍指向原有的字符串'abc'
,但变量b
却指向新字符串'Abc'
了:
┌───┐ ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘ └───────┘
┌───┐ ┌───────┐
│ b │─────────────────>│ 'Abc' │
└───┘ └───────┘