变量与对象之间的关系
在许多语言中,对象跟变量都是很容易弄混淆的两个概念。
在上图中,我们把a赋值为5,那么是否就可以说a是一个整型对象呢。事实不是这样的,或者说这种说法不够严谨。
a只是一个变量,他的地址指向了5这个整型对象。
我们再把a的值赋给b,打印发现两个变量的id相同。说明两个变量指向了同一个对象。这个时候我们对a重新进行赋值。
这时候我们发现a的重新赋值,并不影响b的结果。事实上也是这样,a的重新赋值只是改变的a所指向的对象。并不会对b的地址造成影响,但是如果是对该对象的值进行修改呢。
我们都知道在python中,字符串,元组,整型这些对象创建成功后就无法改变了。但是像列表,字典这样的可变参数改变又会如何呢。
在列表a中,我们发现把a的值赋给了b。当a的值改变的话,b的值也自动进行了改变。就像焦不离孟一样死死的绑定一起。其实也不难理解,打印a,b的id发现id相同。a,b变量指向的是相同的对象。当对象改变的时候,变量的值自然而然的改变。
我们如果对b进行操作,a的值也会进行改变。
浅拷贝
这种行为我们可以理解,但是具体在使用的时候可能会出现问题。我们如何来解决这种问题,或者是摆脱这种依赖呢,就需要用到copy。
我们通过a拷贝出来b,虽然b的值与a的值相同。但是他俩的id却并不相同,说明a和b其实是指向了两个完全不相同的对象。
这个时候我们再对a,b进行操作看是否会有影响呢。
很显然,我们再对a和b进行操作的时候,并不会相互影响,因为他们是不同的对象,这样是不是就解决问题了呢,我们如果有一个二阶列表。
我们新定义了一个二阶列表a,同时b拷贝啊。打印a,b二者的id,两者的id当然不同。我们对b进行添加值时,事实上对a也没有影响。
但是当我们进行
b[-2].append('b')
a的值也受到了影响,这是为什么呢,我们不妨打印改变的这个子列表的id
这时候我们发现了问题的原因了,我们使用浅拷贝,确实改变了b的id,但是b的子列表的id依然引用了a的子列表的id,那么如何解决这个问题呢。
深拷贝
这个时候我们就需要借助深拷贝了deepcopy
这个时候我们发现,使用深拷贝之后,不但a与b的id不同,a和b的子列表的id也不相同,这样在进行他们的操作时就不会再产生任何影响了。