python中数值类型是不可变对象,当程序试图改变数据的值时,程序会重新生成新的数据,而不是改变原来的数据。
python函数的参数都是对象的引用,如果在引用不可变对象时尝试修改对象,程序会在函数中生成新的对象(开辟新的地址空间),函数外被引用的对象则不会被改变。
num=1
def add(num):
num+=1
print(num)
//1
如果想改变num的值,可以通过函数返回值来实现
L = [1, 2]
def add(list):
list.append(3)
add(L)
print(L)
//[1, 2, 3]
这里因为函数的参数是引用
深复制和浅复制
1.copy.copy,仅仅复制父对象
2.copy.deepcopy,复制父对象和子对象
import copy
list1=[1,2,['a','b']]
list2=list1
list3=copy.copy(list1)
list4=copy.deepcopy(list1)
list1.append(3)
list1[2].append('c')
print(list1,'\n',list2,'\n',list3,'\n',list4)
# [1, 2, ['a', 'b', 'c'], 3]
# [1, 2, ['a', 'b', 'c'], 3]
# [1, 2, ['a', 'b', 'c']]
# [1, 2, ['a', 'b']]