Python是一门很好的语言,他的优点在于拥有巨大灵活性的同时也拥有无比的严谨性,其他语言规定了很多语法,告诉你什么情况下,语法就是这样的,而Python却用很少的规定,延伸出很多语法,有些语法看上去很奇怪,仔细分析却是那么的合理。今天思考了Python中关于指针和深浅复制的问题,下面希望能通过根据内存空间的变化对这些让人头疼的问题作出一个解释。
首先看第一个例子:
a = 1
b = a
b = 2
print ’a = %s‘ %a, ‘b = %s’%b
结果:a = 1 b = 2
当执行a = 1操作时,内存中先分配一个整型变量的空间并赋值为1,然后将a指向这块空间,执行b = a时,将b也指向这块内存,这时,a和b的地位是一样的。b = 2,按说会把当前b指向的那块内存赋值为2,其实Python并不会这样做。因为在Python中,整型以及其他基本类型加上字符串和元组等是不可以被修改的。意思是他们一旦被声明,在内存上就不能被改变。那么执行b = 2时发生的是,系统分配一个整型的内存,并赋值为,再将这块内存的地址赋给b,因此a和b就指向了不同的值。
在看一个很矛盾的例子:
a=[1,[2],3]
b=a
b[0]=0
print a
结果:[0,[2],3]
这好像不太对,和上面说的有点矛盾,其实并不矛盾。因为列表是可以修改的,a和b指向的是一个列表,其实列表时存的是一组指针。指针是可以修改的。元组不能修改就是因为元组里的数据是内存上的数据本身,而列表里元素是指针。当使用b修改b[0]时,实际上是将原本指向一个1的指针b