- 赋值:相当于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]])
---------------