如题,这里复习一下python的深浅拷贝问题(因为考试的时候有道题做错了:()
首先看定义:
浅拷贝:浅拷贝会创建一个新的对象,但新的对象仅复制原对象的第一层内容,对于嵌套的子对象,仅复制引用,不会递归拷贝内部对象。
import copy
original = [1, [2, 3], 4]
shallow = copy.copy(original)
shallow[0] = 99 # 修改第一层元素
shallow[1][0] = 88 # 修改嵌套的子对象
print("Original:", original) # Original: [1, [88, 3], 4]
print("Shallow:", shallow) # Shallow: [99, [88, 3], 4]
深拷贝:深拷贝会创建一个新的对象,并递归拷贝所有嵌套的子对象,使新对象完全独立于原对象。
import copy
original = [1, [2, 3], 4]
deep = copy.deepcopy(original)
deep[0] = 99 # 修改第一层元素
deep[1][0] = 88 # 修改嵌套的子对象
print("Original:", original) # Original: [1, [2, 3], 4]
print("Deep:", deep) # Deep: [99, [88, 3], 4]
但是,我一直有个误区,把"引用传递"机制当成浅拷贝,这是两个不同的概念,python基于值的内存管理造就了引用传递,但是引用传递在对象的可变性不同时又会呈现不同的效果,比如在函数传参时,可变对象(list)和不可变对象(tuple)都是引用传递,但是效果是不一样的:
def test(lst:list, string:str):
lst[0] = 10
string += 'a'
return string
lst = [1,2,3]
string = 'vscode'
string_new = test(lst, string)
print(lst, string, string_new)
#输出 [10, 2, 3] vscode vscodea
由于传递的是引用,所以对函数内列表形参修改时也会影响外部的原始列表,但是字符串由于是不可变对象,所以当你在函数内对其进行一些合法的操作时,会创建一个新的对象用于操作,而不会修改原始对象.
写下此文,希望下次 不再犯错
评论 (0)