深拷贝,浅拷贝

一、深浅拷贝

  • 浅copy与deepcopy(What)

    • 浅copy: 不管多么复杂的数据结构,浅拷贝都只会copy一层

    • deepcopy : 深拷贝会完全复制原变量相关的所有数据,在内存中生成一套完全一样的内容,我们对这两个变量中任意一个修改都不会影响其他变量

import copy
sourceList = [1,2,3,[4,5,6]]
copyList = copy.copy(sourceList)
deepcopyList = copy.deepcopy(sourceList)
​
sourceList[3][0]=100
​
print(sourceList)           # [1, 2, 3, [100, 5, 6]]
print(copyList)             # [1, 2, 3, [100, 5, 6]]
print(deepcopyList)         # [1, 2, 3, [4, 5, 6]]

二、变量及其存储

  • 1.python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身

  • 2.不管多么复杂的数据结构,浅拷贝都只会copy一层。

  • 理解:两个人公用一张桌子,只要桌子不变,桌子上的菜发生了变化两个人是共同感受的。

>>> str1 = 'hello'
>>> str2 = str1
​
#1、让str1和str2变量都存储了‘hello’所在的内存地址
>>> id(str1)
22748280
>>> id(str1)
22748280
>>>
​
#2、当str1的值变成‘new hello’后str1的值被重新赋值成'new hello'的内存地址,而str2的值依旧是‘hello’的内存地址
>>> str1 = 'new hello'
>>> id(str1)
22748320
>>> id(str2)
22748280
​
#3、不管多么复杂的数据结构,浅拷贝都只会copy一层。
>>> sourceList = [1,2,[3,4]]
>>> newList = sourceList
​
>>> l[2][0]=100
​
>>> sourceList
[1, 2, [100, 4]]
>>> newList
[1, 2, [100, 4]]
​

三、is和==区别

  • is不仅数据一样内存地址也一样

  • == 只判断数据和数据类型一样即可

 

四、函数中把列表当参数

  • 当定义函数时,会保存函数中默认参数 list 的值,也就是列表 l=[];

  • 在每次调用的时候如果传递了新的列表,则使用传递的列表,没有传递,使用定义函数时保存的默认参数(l=[]);

  • 在调用中没有传递新的列表(使用默认列表 l=[] )的时候,程序会调用定义函数时保存的默认参数((l=[]));

  • 列表在append的时候会在 l=[] 原来的基础上append追加值,所以会产生以下结果.

def func(a,li=[]):
    li.append(a)
    return li
​
a = func('aa')
b = func('123',[])
c = func('bb')
print(a)    # ['aa', 'bb']
print(b)    # ['123']
print(c)    # ['aa', 'bb']
​
  • 如何解决

def func(a,li=[]):
    if not li:
        # 如果l不为空的话,就往下走(清空列表); 为空就不走
        li = []
    li.append(a)
    return li
​
a = func('aa')
b = func('123',[])
c = func('bb')
print(a)    # ['aa',]
print(b)    # ['123']
print(c)    # ['aa',]
​
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值