鱼C论坛

 找回密码
 立即注册
查看: 1030|回复: 10

python11课时课后题5:关于列表复制和标签有些问题

[复制链接]
发表于 2020-6-15 14:54:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
上课的时候了解到关于列表的复制:
假设对于:
list1 = [1, 5, 23, 6, 3, 6, 2, 7]
list2 = list1[:]
list3 = list1
list2和list3本质上是不一样的,小甲鱼的举例是:
list1.sort()
运行这个代码之后,list2不会变,但list3会跟着一起变。

那如果我对list1做出以下改变:
list1 = [1, 2, 3, 4, 5]
我便发现list3并没有跟着list1发生改变。

为什么这种情况下list3不会跟着一起变呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-15 15:34:25 | 显示全部楼层
sort是排序,重新给原始的那个list1赋值。
后面代码只是单纯赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 15:36:46 | 显示全部楼层
本帖最后由 青出于蓝 于 2020-6-15 15:38 编辑

需要知道的是,sort是对原列表排序
而list3被赋值为原列表,所以打印出排序后列表。

后面那段代码不是在原列表赋值,所以list3不会重新赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 15:44:06 | 显示全部楼层
欢迎追问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-15 15:59:41 | 显示全部楼层

所以只要是对原列表的改变都可以使list1和list3互相影响?因为他们只是名字,真正被改变的是那个列表,像insert()和pop()这些功能也会产生同样的效果?
而第二种情况就是list1不再是原列表的名字了,变成了一个新的列表的名字吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 16:00:21 | 显示全部楼层



为什么这种情况下list3不会跟着一起变呢?


切片方法可以等价浅复制,是在Python 中重新开辟一个内存来储存这个新列表

你简单理解,切片就是重新在原本的列表上复制,重新赋值给另一个变量

而列表的 大部分方法都是在原列表上进行变化 比如 append、reverse、remove、insert、extend、sort等,都是在原列表上进行改变的

而你列表切片是重新复制了一个列表,和原先的列表没有直接关联了,所以你后来的 list3并没有跟着list1发生改变。

但是你直接这样:
list1 = [1, 5, 23, 6, 3, 6, 2, 7]
list2 = list1

这样list1 ,list2都是指向同一个列表 [1, 5, 23, 6, 3, 6, 2, 7] ,所以只要列表本身改变,与其关联的列表全部发生改变

所以当这样时候,只要有一个列表发生改变,就改变了与之关联的变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 16:06:38 | 显示全部楼层
本帖最后由 青出于蓝 于 2020-6-15 16:08 编辑
Deskcat 发表于 2020-6-15 15:59
所以只要是对原列表的改变都可以使list1和list3互相影响?因为他们只是名字,真正被改变的是那个列表,像 ...


不用非得是原列表改变,只要在list3赋值前赋值list1就可以
list1 = [1, 5, 23, 6, 3, 6, 2, 7]
list1=[1, 2, 3, 5, 6, 6, 7, 23]
list2=list1
print(list2)
这样也是可以的 欢迎追问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 16:16:15 | 显示全部楼层
打个比喻(学来的):
list1 = 小孩1
list2 = 小孩2
list3 = 小孩3

[1, 5, 23, 6, 3, 6, 2, 7] = 气球1
[1, 2, 3, 4, 5] = 气球3
list1 = [1, 5, 23, 6, 3, 6, 2, 7] (小孩1牵着气球1)
list2 = list1[:] (小孩子2牵着气球2(但是气球2与气球1同款,但不是同一个))
list3 = list1 (小孩3和小孩1同时牵着气球1)
list1 = [1, 2, 3, 4, 5] (小孩1放开了气球1,牵着气球3)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 16:55:00 | 显示全部楼层
本帖最后由 1223253411 于 2020-6-15 17:04 编辑

清晰点说吧

首先你要了解一下列表的切片原理,什么是切片,对列表进行切片并不是对列表的本身进行改动,而是复制了一个新的列表,记住,是复制了一个新的!新的列表

然后我们看看代码
list2 = list1[:]   是什么?就是将list1指向的列表复制了一份,在将新的列表赋值给了list2,list2和list1虽然内容相同,但其本质已经是两个完全不相干的列表了

list3 = list1 又是什么?这就是将list3变量指向了list1所指向的列表
就像 a = 1     b = a  这是不是就是让b指向了a 所指向的1

list1.sort()   改变list1会发生什么,此时list1和list3是不是指向的都是同一个列表,那list1发生改变,list3不也理所当然的一起发生了改变吗

然后list1 = [1, 2, 3, 4, 5]  这是什么?
这就是
a = 1
b = a
a = 2
你告诉我b是多少?不用想了就是1吧
那list1重新赋值了影响list3变量吗
list3是不是还是指向了 [1, 5, 23, 6, 3, 6, 2, 7]
那list1此时与list3还有任何联系了吗

你可以使用id()来看下它们的本质,不过建议画图理解
希望能帮助你的理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-16 20:20:19 | 显示全部楼层
明白一点,数据的开辟空间给的是真正的数据,而不是变量名。变量名其实只是为了方便你知道这个你开辟的数据存在而已,实际的操作还是对真正创建的数据的操作。
比如list1 = [1, 5, 23, 6, 3, 6, 2, 7],真正操作的对象是右边的列表,而不是左边的变量名,所以你sort的时候,变的是列表,指向这个列表的所有变量名的值都会变
[:]是切片,等于重新创造了一个列表,
把一个变量名重新指向了一个新的列表,并不影响原来指向这个列表的变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-16 21:25:21 | 显示全部楼层
可以理解成sort是在原列表上做修改
list1 = [1,2,3,4]
list3 = list1
以上这段代码是把list1list3这俩个标签贴在[1,2,3,4]

list1.sort()之后,就相当于把list1指向的列表修改了
而list1 = [3,4,5,6],就相当于把list1这个标签从[1,2,3,4]上撕下来,贴在了[3,4,5,6]
但是list3还在[1,2,3,4]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 16:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表