is&==&copy

is与==的区别

a = [1,2,3]

b = [1,2,3]

a == b  

    ==>True

a is b

    ==>False        

数字在-5256时如:

    a = 1

    b = 1

    a is b  ==> True

is判断两个引用是否指向同一对象(地址),引用比较
   a = [1,2,3],b = [1,2,3]中两个列表存放的地址不同,可以用id(a),id(b)验证
==判断两个对象的值是否相等

 

copy与deepcopy

copy

        a = [1,2,3]
   b = a
   ==>id(a) == id(b)
copy(需要导入copy模块)
   c = copy.deepcopy(a)
   ==>id(a) != id(c)
   此时在另一地址又存放了一份儿[1,2,3],由c指向这个地址,a还指向原来的[1,2,3]的地址,
   当a指向的那块地址的值改变后如a.append(4),ac不变。

另一例浅copy
   a = [1,2,3]
   b = [4,5,6]
   c = [a,b]
   d = c
   此时ab分别指向不同的内存地址,c开辟另一内存空间存放ab这两个引用,就把c中的a指向原有的a指向的地址,
   c中的b指向原有的b指向的地址。
   dc为浅copyd指向c的内存地址。
另一例深copy
        e = copy.deepcopy(c)
   此时e开辟另一内存空间存放ab这两个引用,就把这两个引用所指向的内容在另一地址又存放一份儿,并分别用e中的
   ab指向它们。
   
再一例copy.deepcopy()
   a = [1,2,3]
   b = [4,5,6]
   c = (a,b) #不可变类型元组
   d = copy.deepcopy(c)
   abd还是不变,原因与列表相同

还一例copy.copy()
   a = [1,2,3]
        b = [4,5,6]
          c = [a,b]
          e = copy.copy(c)
   此时e另开一内存存放a,b两个引用,但这两个引用还是指向原来的a,b所指向的内存空间

最后一例copy.copy()
   a = [1,2,3]
           b = [4,5,6]
           c = (a,b)#不可变类型
   e = copy.copy(c)
   此时e并不开辟另一内存空间,它指向c的地址,ab变它也变

总结:
   深copy,不管被copy的对象是可变类型还是不可变类型,都是另开辟一块内存空间,如果存

   放的值是引用,
   那将引用的内容也同样另开一块空间存放,其实就是只要是deepcopy之后,前后两者已经
   没有任何关系了。
   浅copy,如果被copy的对象是可变类型,就开另一地址存放,如果是不可变类型,它就直接
   指向被copy对象的地址。如果存放的值是引用,不开辟另一内存空间,里面的引用还是指向原

    来的那个地址,所有原来那个地址的值改变之后,copy过来的值也同时改变。

 

posted @ 2018-05-31 19:03  whz_it  阅读(126)  评论(0编辑  收藏  举报