python默认变量赋值是以python对象的形式赋值,改变原来的变量值,所有相关变量值都会改变
如何区分或者控制各个变量?
针对不可变常量
import copy
a = 'test'
print("=====赋值=====")
b=a
print(a)
print(b)
print(id(a))
print(id(b))
print("=====浅拷贝=====")
b=copy.copy(a)
print(a)
print(b)
print(id(a))
print(id(b))
print("=====深拷贝=====")
b=copy.deepcopy(a)
print(a)
print(b)
print(id(a))
print(id(b))
输出结果:
综上可知:不可变类型没有被拷贝的说法,不管操作都是同一个地址内容
对于可变对象
import copy
a=[1,2,3]
print("=====赋值=====")
b=a
print(a)
print(b)
print(id(a))
print(id(b))
print("=====浅拷贝=====")
b=copy.copy(a)
print(a)
print(b)
print(id(a))
print(id(b))
print("=====深拷贝=====")
b=copy.deepcopy(a)
print(a)
print(b)
print(id(a))
print(id(b))
返回结果
综上可知,可变类型浅拷贝和深拷贝均会开辟新的地址
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝
a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )
返回结果
综上发现:
1、复制对象b随原列表a一起变化
2、外层append 添加元素时,浅copy b不会随原列表a变化而变化
3、内层添加元素时,浅copy会随原列表a变化而变化
4、无论原列表a如何变化,深copy d都保持不变
心得:
想要更新原列表,建议操作深度copy的列表