Pyhton的浅拷贝copy应用、可变变量的内存地址指向(id)

场景一:不使用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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Buaixiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值