python赋值、浅拷贝、深拷贝

  • 赋值:相当于c的指针。修改了其中一个变量,另一个跟着改变。注意对不可变对象,新赋值,就是修改了指向。(int、字符串(string)、float、(数值型number)、元组(tuple))
  • 浅拷贝:新建一个对象(实例),实例里面的不可变元素修改,新的实例不会跟着改变;修改实例里面的可变对象的内容,实例新的实例会跟着改变。方法有1,完全切片方法b=a[:];2,工厂函数,如list();3,copy模块的copy()函数
  • 深拷贝:新建一个对象(实例),并且递归赋值了所有实例。怎么修改实例,新的实例都不会受到影响。方法:copy模块的deepcopy()函数
# 赋值
    print(u"赋值-不可变对象")
    a = 1
    b = a
    print("a=", a)
    print("b=", b)
    print("---------------")
    a = a + 1  # int 为不可变对象,a的指向变了 a != b
    print("a=", a)
    print("b=", b)
    print("---------------")

    print(u"赋值-可变对象")
    a = list(range(3))
    b = a  # b 引用a 相当于指针
    print("a=", a)
    print("b=", b)
    print("---------------")
    a.append(4)  # 虽然是append,b的值也随之改变,a == b
    print("a=", a)
    print("b=", b)
    print("---------------")

    from copy import copy, deepcopy
    # 浅拷贝
    print(u"浅拷贝")
    a = list(range(3))
    a.append([1, 2])
    b = copy(a)
    print("a=", a)
    print("b=", b)
    print("---------------")
    a.append(1)  # 直接操作a,b不会跟着改变
    print("a=", a)
    print("b=", b)
    print("---------------")
    a[3].append(3)  # 修改a里面的可变实例(相当于引用),b跟着改变
    print("a=", a)
    print("b=", b)
    print("---------------")

    # 深拷贝
    print(u"深拷贝")
    a = list(range(3))
    a.append([1, 2])
    b = deepcopy(a)
    print(a, b)
    a.append(1)
    print("a=", a)
    print("b=", b)
    print("---------------")
    a[3].append(3)
    print("a=", a)
    print("b=", b)
    print("---------------")

运行结果

赋值-不可变对象
('a=', 1)
('b=', 1)
---------------
('a=', 2)
('b=', 1)
---------------
赋值-可变对象
('a=', [0, 1, 2])
('b=', [0, 1, 2])
---------------
('a=', [0, 1, 2, 4])
('b=', [0, 1, 2, 4])
---------------
浅拷贝
('a=', [0, 1, 2, [1, 2]])
('b=', [0, 1, 2, [1, 2]])
---------------
('a=', [0, 1, 2, [1, 2], 1])
('b=', [0, 1, 2, [1, 2]])
---------------
('a=', [0, 1, 2, [1, 2, 3], 1])
('b=', [0, 1, 2, [1, 2, 3]])
---------------
深拷贝
([0, 1, 2, [1, 2]], [0, 1, 2, [1, 2]])
('a=', [0, 1, 2, [1, 2], 1])
('b=', [0, 1, 2, [1, 2]])
---------------
('a=', [0, 1, 2, [1, 2, 3], 1])
('b=', [0, 1, 2, [1, 2]])
---------------

你可能感兴趣的:(python赋值、浅拷贝、深拷贝)