首先来一段热热身:
#encoding=utf-8
a = 1
b = a
a = 0
print a,b
结果是什么? 对,没错! 就是 0,1!
好的,现在开始转化思想了:
第一步:在面向对象编程中,你要将A想成一个写入到内存的地址 “0” 这个地址指针, 而“0”这个内存地址存放着 数字0 这个数据;
第二步:将A赋值赋值给B? 你在扯淡么? 你要理解成,将B想成是内存地址“0”的指针,指向的数据是数字0;至于为什么这么想,后面你就能知道!
第三步 到 第四步: 很正常的重新赋值与打印语句,不做讨论了。
那么我们再来:
#encoding=utf-8
a = [1, 2, 3, 4]
b = a
a[0] = 4
print a,b
OK,问题来了,请问A会打印什么? B会打印出什么?
有人告诉Candy:“把A赋值给B后,B就和A一样了嘛! 而A重新修改数据后不会对B造成影响,所有A和B的值不一样”
上面的人没说错,理论上很多人都会这样想,但是我刚刚提到过:“把A想成指针.”,而且B也同样是指针;
当2个指针指向同一块内存区域后,即使那块区域如何修改,2个指针的只也会随着区域的修改而修改,下面证明了Candy的说法,大家也可在自己电脑上尝试:
C:\Python27\python.exe C:/Python27/project/two/Main.py
[4, 2, 3, 4] [4, 2, 3, 4]
Process finished with exit code 0
看到这个肯定会有人问了:”那为什么你刚刚在上面的热身代码不是这样的情况呢?“
因为a 在重新赋值后指针指向的内存地址不同了,而B依然指向的内存地址是原来的,这时候就会出现输出不同的情况了,了乎?
那么再看一个例子:
#encoding=utf-8
a = [1, 2, 3, 4]
b = a
a = [2, 2, 3, 4]
print a,b
All right, 这个例子同第一个例子! A在指向列表[1,2,3,4]后,把这个内存地址告诉了B!B知道这个内存地址后,A又新建一了个列表[2,2,3,4],然后输出;
最后吐槽一句吧!其实Python 和 C 真心还是密不可分的。
新增:
感谢反馈问题的几个朋友,由于代码是直接从coding里面copy出来! 在发布后有问题,感谢反馈~~~