python 变量赋值、copy 笔记

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的列表 

猜你喜欢

转载自blog.csdn.net/bulucc/article/details/126745380