场景一:不使用copy拷贝可变变量
def fib(n, l=None):
print(f'原本l:{id(l)},{l}')
import copy
# l = copy.copy(l)
print(f'原本l:{id(l)},{l}')
for i in range(n):
l.append(l[i] + l[i + 1])
print(f'原本l:{id(l)},{l}\n')
l = [1, 2] # 定义可变变量l
fib(3, l)
fib(3, l)
执行结果:
可变变量 l 的 id 完全一样
第一次调用后 l = [1, 2, 3, 5, 8]
第二次调用时,l = [1, 2, 3, 5, 8],append后l = [1, 2, 3, 5, 8, 3, 5, 8]
场景二:使用copy拷贝可变变量
def fib(n, l=None):
print(f'原本l:{id(l)},{l}')
import copy
l = copy.copy(l) # copy生成原l列表的副本
print(f'副本l:{id(l)},{l}')
for i in range(n):
l.append(l[i] + l[i + 1])
print(f'副本l:{id(l)},{l}\n')
l = [1, 2] # 定义可变变量l
fib(3, l)
fib(3, l)
执行结果:
l = copy.copy(l)
用copy方法,拷贝l,生成l的副本(生成新的id),后续对副本l进行操作,不会影响原来的l(原来l的id不变)
场景三:不使用copy,不定义可变变量l,直接传参[1, 2]
def fib(n, l=None):
print(f'原本l:{id(l)},{l}')
import copy
# l = copy.copy(l) # copy生成原l列表的副本
print(f'副本l:{id(l)},{l}')
for i in range(n):
l.append(l[i] + l[i + 1])
print(f'副本l:{id(l)},{l}\n')
# l = [1, 2] # 定义可变变量l
# fib(3, l)
# fib(3, l)
fib(3, [1, 2])
fib(3, [1, 2])
执行结果:
不定义变量l,每次调用的时候直接传列表[1,2]
不使用copy,l的所有id都是一样
第一次调用时,l = [1,2],操作后l = [1, 2, 3, 5, 8]
第二次调用时,重新传参[1,2],l = [1,2],操作后l = [1, 2, 3, 5, 8]
场景四:使用copy,不定义可变变量l,直接传参[1, 2]
def fib(n, l=None):
print(f'原本l:{id(l)},{l}')
import copy
l = copy.copy(l) # copy生成原l列表的副本
print(f'副本l:{id(l)},{l}')
for i in range(n):
l.append(l[i] + l[i + 1])
print(f'副本l:{id(l)},{l}\n')
# l = [1, 2] # 定义可变变量l
# fib(3, l)
# fib(3, l)
fib(3, [1, 2])
fib(3, [1, 2])
执行结果:
不定义变量l,每次调用的时候直接传列表[1,2]
使用copy,copy后生成l的副本l,产生新的id
第一次调用时,l = [1,2],操作后l = [1, 2, 3, 5, 8]
第二次调用时,重新传参[1,2],l = [1,2],操作后l = [1, 2, 3, 5, 8]
与场景三输出结果一致,不同在于列表使用copy生成了新的列表,产生了新的id