鱼C论坛

 找回密码
 立即注册
查看: 2069|回复: 4

还是赋值 vs 分片拷贝

[复制链接]
发表于 2023-4-29 00:14:43 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 lzb1001 于 2023-4-29 00:21 编辑

>>> old = [1, 2, 3, 4, 5]
>>> new = old
>>> new
[1, 2, 3, 4, 5]
>>> old = [6]
>>> new
[1, 2, 3, 4, 5] # 现在可以理解了

>>> old[:] = [60] # 与old = [6]有何不同?
>>> old
[60]
>>> new
[1, 2, 3, 4, 5] # 还是保持不变,但按我上一个问题中“歌者文明清理员”的解答不是应该返回[60]才对吗?

>>> new = old
>>> old[:] = [16]
>>> old
[16]
>>> new # 这里返回值怎么就变了?
[16]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-29 00:16:34 | 显示全部楼层
在这个例子中,我们比较了两种不同的赋值方式:直接赋值和分片拷贝。首先解释一下两种赋值方式的区别:

1. 直接赋值:当我们将一个变量赋值给另一个变量时,实际上是将原变量的引用(reference)赋值给新变量。这意味着两个变量指向内存中的同一个对象。

2. 分片拷贝:这是一种浅拷贝(shallow copy)方式,通过分片(slicing)创建一个新的列表,包含原列表的所有元素。这意味着新列表是原列表的一个副本,它们在内存中是分开的。

现在,让我们逐步分析示例中的代码:

1.  old = [1, 2, 3, 4, 5]  和  new = old :这里使用了直接赋值, new  和  old  指向内存中的同一个列表。
2.  old = [6] :这里将  old  变量指向一个新的列表  [6] 。此时, new  仍然指向原列表  [1, 2, 3, 4, 5] 。
3.  old[:] = [60] :这里使用分片拷贝,将原列表的所有元素替换为一个新列表  [60] 。这个操作不会改变  old  的引用,所以  new  仍然指向原列表  [1, 2, 3, 4, 5] 。
4.  new = old :再次使用直接赋值,现在  new  和  old  指向同一个列表  [60] 。
5.  old[:] = [16] :使用分片拷贝,将原列表的所有元素替换为一个新列表  [16] 。这个操作不会改变  old  的引用,因为  new  和  old  指向同一个列表,所以  new  也会变为  [16] 。

总结:直接赋值和分片拷贝的主要区别在于它们操作对象的方式。直接赋值只是复制引用,而分片拷贝创建一个新的列表副本。在上述示例中,你可以看到这种区别如何影响代码的执行结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 00:23:12 | 显示全部楼层
在old=[6]这一步,old和new已经是两个变量了,已经分开了
应该再加上一行:
new=old
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 01:06:41 | 显示全部楼层
歌者文明清理员 发表于 2023-4-29 00:23
在old=[6]这一步,old和new已经是两个变量了,已经分开了
应该再加上一行:

>>> new = old # 大神是说加在这里吗?
>>> old[:] = [16]
>>> old
[16]
>>> new
[16]

点评

我很赞同!: 5.0
我很赞同!: 5
yes  发表于 2023-4-29 01:17
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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