1、如果形参是变量
def n(a):
a = a + 1
b = 0
n(b)
print(b) # 0
b仍然为0,没有改变传入变量。
2、如果形参是列表
直接作为实参传入会改变
def n(a):
a[0] = a[0] + 1
b = [0, 1, 2]
n(b)
print(b) # [1, 1, 2]
使用切片或.copy()传入,在列表中没有其他对象时,和深拷贝一样,传递的是列表副本。
b = [0, 1, 2]
n(b[:]) # 或 n(b.copy())
print(b) # [0, 1, 2]
如果列表中有其它对象时,当改变其中对象的值时,仍然会改变传入实参。
def n(a):
a[2][0] = a[2][0] + 1
b = [0, 1, [2, 3]]
n(b[:])
print(b) # [0, 1, [3, 3]]
但如果改变的不是其中对象的值时,就不会改变传入实参。
def n(a):
a[1] = a[1] + 1
b = [0, 1, [2, 3]]
n(b[:])
print(b) # [0, 1, [2, 3]]
使用copy库中的.deepcopy()一定是深拷贝
b = [0, 1, [2, 3]]
c = copy.deepcopy(b)
n(c)
print(b) # [0, 1, [2, 3]] 此时c已经改变了
如果仅仅是将b赋值给c那么它们指向同一个地址,会同时改变b,c
def n(a):
a[2][0] = a[2][0] + 1
b = np.array([0, 1, [2, 3]])
c = b
n(c)
print(b) # [0 1 list([3, 3])]
3、如果形参是numpy数组
要注意如果实参为数组切片,同样会改变实参数组值;其它情况不变。
def n(a):
a[1] = a[1] + 1
b = np.array([0, 1, 2])
n(b[0:])
print(b) # [0 2 2]