oeasy玩py107列表_拷贝_copy_赋值_assignment

oeasy玩python107_列表_拷贝赋值

列表_拷贝_copy_赋值_assignment

回忆

  • 上次研究的是del 删除

    • 可以 删除列表项

    • 也可以 删除切片

图片描述

  • 就像择菜一样

图片描述

  • 择出去的菜 搁哪儿 了呢?🤔

地址

  • 英雄列表

    • 刘关张

hero_list = ["刘备", "关羽", "张飞"]
print(hero_list)
del hero_list[1:2]
print(hero_list)

图片描述

  • del 列表切片后

    • 帧栈(Frame)上 还是 只能看见 hero_list

    • 此时列表 还剩 2个列表项

    • 堆对象空间(heap)上 释放了hero_list[1]内存

  • 如果 切片 没被赋给任何对象

    • 也就消失

  • 怎么 存住 被删的切片 呢?

观察

  • 把 被删的切片

    • 赋给 变量 呢?

hero_list = ["刘备", "关羽", "张飞"]
print(hero_list)
selected = hero_list[1:2]
del hero_list[1:2]
print(hero_list)
print(selected)
  • 切完切片之后

    • 将切片信息 赋给 一个新列表变量

    • 这个切片就保留下来了

图片描述

  • 修改切片

    • 会影响原始列表吗?

修改切片

  • 新切片

    • 有自己的空间

hero_list = ["刘备", "关羽", "张飞"]
print(hero_list)
selected = hero_list[1:2]
del hero_list[1:2]
selected.append("赵云")
print(hero_list)
print(selected)
  • 对新切片对象的操作

    • 不影响原来的切片

图片描述

  • 那如何 让列表 互相影响 呢?

互相影响

  • 直接 用列表 给 新变量赋值

    • 让clist1、clist2指向同一个地址空间

clist1 = list("oeasy")
clist2 = clist1
clist1.append("?")
clist2.append("!")

图片描述

  • 为啥clist1、clist2会相互影响?

id

  • 去看看 具体地址

clist1 = list("oeasy")
print(clist1,id(clist1))
clist2 = clist1
print(clist2, id(clist2))
clist1.append("?")
clist2.append("!")
print(id(clist1) == id(clist2))
  • clist1、clist2 引用的是

    • 同一个对象地址

    • 所以

      • 不论 谁append

      • 都会append到 这个地址对应的列表 上

图片描述

  • 列表 被引用了 几次 呢?

getrefcount

  • getrefcount

    • 可以得到 对象

    • 引用次数

import sys
clist1 = list("oeasy")
print(sys.getrefcount(clist1))
  • 明明是 clist1

    • 1个变量引用

图片描述

  • 为什么 显示 2个引用 呢?

帮助手册

import sys
help(sys.getrefcount)
  • 每次 getrefcount被调用时

    • 增加 1个引用

    • 所以显示2个

图片描述

  • 取消引用

    • 被引用数 会减少 吗?

取消引用

clist2 = clist1
print(sys.getrefcount(clist1))
clist2 = []
print(sys.getrefcount(clist1))
del clist1
print(sys.getrefcount(clist1))
  • 这时候 clist2引用 别的地址

    • 那clist1 引用数 就会减1

图片描述

  • clist1 和 clist2 引用 同一位置

    • 他俩 会一改全改

    • 有什么办法 不要 一改全改 吗?

使用构造函数

  • 新作一个列表

    • 根据 nlist1

    • 造一个 nlist2

nlist1 = [1, 2, 3]
nlist2 = list(nlist1)
print(id(nlist1), id(nlist2))
  • id 不同

    • 对应的空间 也不同

图片描述

  • 还有 啥方法 可以不影响 原列表 吗?

copy副本

  • 使用list类的 copy方法

clist1 = list("oeasy")
clist2 = clist1.copy()
clist1.append("?")
clist2.append("!")
  • 列表 和 列表的拷贝

    • 引用不同的位置

图片描述

  • 这 两个列表 地址还相同 吗?

确保

clist1 = list("oeasy")
clist2 = clist1.copy()
print(id(clist1))
print(id(clist2))
  • id不同

    • copy后 就新分出 空间

图片描述

  • 给 原列表 做了个副本

copy

  • 拷贝 就是

    • 建立副本

图片描述

  • copy这个单词

    • 源于 中世纪时候

    • 手抄本

图片描述

  • 影响到 后来的

    • 复印机

拷贝

  • 胶片时代

    • 表示胶片的拷贝

    • 制片公司的产品 是 拷贝

图片描述

  • 到了 电脑时代

    • 复制文件的命令

    • 就是c(o)p(y)

图片描述

  • copy函数 可以制作副本(copy)

总结🤔

  • 列表 赋值运算 两种形式

    1. 将列表 直接 赋值

      • 造成两个列表指向同一个对象

      • 一改全改

    2. 将 列表副本 赋给 变量

      • 这两个列表变量指向不同的对象

      • 互不影响

clist1 = list("oeasy")
clist2 = clist1
clist2 = clist1.copy()

图片描述

  • 列表 能相加 吗?🤔

lst1 + lst2
  • 下次再说 👋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值