Python之变量与对象

变量与对象

  • 对象 :内存中存储数据的实体,Python中一切皆是对象,函数也是对象;
  • 变量 :对对象的引用,指向对象的指针,变量与对象是分开的;

可变对象与不可变对象

  • 不可变对象 :该对象对应内存中的值不会变,因此如果指向该对象的变量被改变了,会重新开辟一片地址,变量再指向这个新的地址;如:int,float,str,tuple;
  • 可变对象 :该对象对应内存中的值可以被改变,因此变量改变后,该对象也被改变,即原地改变。如:list,dict,set;

对于不可变对象,所有指向该对象的变量在内存中共用一个地址:

>>> a = 1
>>> b = 1
>>> c = a + 0
>>> print(id(a)==id(b) and id(a)==id(c))
True

不可变对象改变一个值,原始变量不变:

>>> a = 1
>>> b = a
>>> b = 2
>>> a
1

可变对象改变一个值,原始变量也被改变:

>>> a = [1]
>>> b = a
>>> b.append(2)
>>> a
[1, 2]

注:当对象的引用计数为0时,该对象对应的内存会被回收。

深拷贝与浅拷贝

不可变对象无论深浅拷贝其地址都一样;
可变对象以list举例,分三种情况:

  • 1直接赋值:仅仅拷贝了引用,因此原list改变,拷贝的也改变;
  • 2浅拷贝:拷贝了最外围对象本身,内部元素拷贝其引用,使用copy;
  • 3深拷贝:外围内围都拷贝对象本身,非引用,前后完全隔离,使用deepcopy;

举例说明:

>>> import copy
>>> a = [1,2,[1,2]]
>>> b = a #直接赋值
>>> c = copy.copy(a) #浅拷贝
>>> d = a[:] #相当于浅拷贝
>>> e = copy.deepcopy(a) #深拷贝
>>> a.append(3)
>>> a
[1, 2, [1, 2], 3]
>>> b #直接赋值的跟随改变
[1, 2, [1, 2], 3]
>>> c #浅拷贝外围为拷贝,因此不变
[1, 2, [1, 2]]
>>> d #同c
[1, 2, [1, 2]]
>>> e #深拷贝内外都不变
[1, 2, [1, 2]]
>>> a[2].append(3)
>>> a
[1, 2, [1, 2, 3], 3]
>>> b #直接赋值的跟随改变
[1, 2, [1, 2, 3], 3]
>>> c #浅拷贝内部拷贝的是应用,跟随改变
[1, 2, [1, 2, 3]]
>>> d #同c
[1, 2, [1, 2, 3]]
>>> e #深拷贝内外都不变
[1, 2, [1, 2]]

猜你喜欢

转载自blog.csdn.net/donghongyi/article/details/83904655