zoukankan      html  css  js  c++  java
  • python3 列表的赋值和深浅拷贝(大坑哦)

    一、赋值操作并没有创建新列表,只是内存地址的赋值操作,两个列表的内存地址是一样的
    = 赋值操作并不会创建新对象,只是把一个变量的内存地址赋值给另一个变量
    old_lst = [1, 2, 3]
    new_lst = old_lst
    print(id(old_lst))
    print(id(new_lst))
    print("old_lst:", old_lst)
    print("new_lst:", new_lst)
    old_lst.append(666)
    print("old_lst:", old_lst)
    print("new_lst:", new_lst)

    执行结果:

    32645384
    32645384
    old_lst: [1, 2, 3]
    new_lst: [1, 2, 3]
    old_lst: [1, 2, 3, 666]
    new_lst: [1, 2, 3, 666]

    二、 浅拷贝copy浅拷贝,只拷贝一层内容,复制一个表面,更深层次的内容,只拷贝一个内存地址。浅拷贝可以通过两种方式实现,一种是切片赋值,一种是copy()函数

    拷贝的意义:快速的创建对象

    1.1.列表切片赋值 两个列表的内存地址不一样(简单的列表,列表元素不包括列表类型)

    old_lst = [1, 2, 3]
    new_lst = old_lst[:]
    print(id(old_lst))
    print(id(new_lst))
    print("old_lst:", old_lst)
    print("new_lst:", new_lst)
    old_lst.append(666)
    print("old_lst:", old_lst)
    print("new_lst:", new_lst)

     执行结果:

    43655432
    43656456
    old_lst: [1, 2, 3]
    new_lst: [1, 2, 3]
    old_lst: [1, 2, 3, 666]
    new_lst: [1, 2, 3]

    1.2.列表切片赋值 两个列表的内存地址不一样(复杂些的列表,列表元素包括列表类型)

    old_lst = [1, [2, 3]]
    new_lst = old_lst[:]
    old_lst[1].append(666)
    print(id(old_lst))
    print(id(new_lst))
    print("old_lst:", old_lst)
    print("new_lst:", new_lst)

    执行结果:

    43524296
    43525384
    old_lst: [1, [2, 3, 666]]
    new_lst: [1, [2, 3, 666]]

    2.1.浅拷贝,只拷贝一层,copy() 两个列表的内存地址不一样(简单的列表,列表元素不包括列表类型)

    old_lst = [1, 2, 3]
    new_lst = old_lst.copy()
    print(id(old_lst))
    print(id(new_lst))
    print("old_lst:", old_lst)
    print("new_lst:", new_lst)
    old_lst.append(666)
    print("old_lst:", old_lst)
    print("new_lst:", new_lst)

     执行结果:

    43524360
    43525384
    old_lst: [1, 2, 3]
    new_lst: [1, 2, 3]
    old_lst: [1, 2, 3, 666]
    new_lst: [1, 2, 3]

     

    2.2.浅拷贝,只拷贝一层,copy() 两个列表的内存地址不一样(复杂些的列表,列表元素包括列表类型)

    old_lst = [1, [2, 3]]
    new_lst = old_lst.copy()
    old_lst[1].append(666)
    print(id(old_lst))
    print(id(new_lst))
    print("old_lst:", old_lst)
    print("new_lst:", new_lst)

     执行结果:

    43720904
    43721992
    old_lst: [1, [2, 3, 666]]
    new_lst: [1, [2, 3, 666]]

     

    三、深拷贝:把内容完全的复制一份

    import copy

    copy.deepcopy()

    两个列表的内存地址不一样,两个列表没有任何的关联了

    1.1(简单的列表,列表元素不包括列表类型)

    import copy
    old_lst
    = [1, 2, 3] new_lst = copy.deepcopy(old_lst) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst) old_lst.append(666) print("old_lst:", old_lst) print("new_lst:", new_lst)

     执行结果:

    37430600
    37446088
    old_lst: [1, 2, 3]
    new_lst: [1, 2, 3]
    old_lst: [1, 2, 3, 666]
    new_lst: [1, 2, 3]

    1.2(复杂些的列表,列表元素包括列表类型)

    import copy
    old_lst
    = [1, [2, 3]] new_lst = copy.deepcopy(old_lst) old_lst[1].append(666) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst)

     执行结果:

    43787592
    43804168
    old_lst: [1, [2, 3, 666]]
    new_lst: [1, [2, 3]]

    四、函数的默认值参数类型如果是可变类型的,注意,这个参数是共享的(大坑哦)(不可变参数:str bool int tuple

    1.1 实例一

    def func(lst=[]):
        lst.append(123)
        print(id(lst), lst)
    
    
    func()
    func()
    func()

     执行结果:

    36175624 [123]
    36175624 [123, 123]
    36175624 [123, 123, 123]

    1.2 实例二

    函数的默认值参数类型如果是可变类型的,注意,这个参数是共享的(大坑哦)

    def func(lst=[]):
        lst.append(123)
        print(id(lst), lst)
    
    
    func()
    func([])
    func()

     执行结果:

    43384584 [123]
    43394440 [123]
    43384584 [123, 123]
  • 相关阅读:
    python制作一个塔防射箭游戏
    有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同 学号的那些结点。
    python实现一个简单的21点游戏
    C语音,函数padd的功能是调整pa指向的链表中结点的位置,使得所有x值为偶数的结点出现在链表的前半部,所有x值为奇数的结点出现在链表的后半部。
    scratch绘制特殊图形1
    验证哥德巴赫猜想,输出6-100之间的偶数等于两个质数之和
    写一函数check检测字符串中的左右括号数是否匹配
    C语言文件操作题,将整数1-10及其算术平方根存入文件,再读取出来显示在屏幕上
    湖南2020对口计算机32题第1、2、3小题
    基础
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10716274.html
Copyright © 2011-2022 走看看