鱼C论坛

 找回密码
 立即注册
查看: 1874|回复: 6

[已解决]关于新版python课第45讲作业的问题

[复制链接]
发表于 2023-3-25 17:39:55 | 显示全部楼层 |阅读模式

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

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

x
x = [1,2,3]
y =x
x = x[::-1]
print(x,y)

z = [1,2,3]
m =z
z[:] = z[::-1]
print(z,m)

输出结果:
[3, 2, 1] [1, 2, 3]
[3, 2, 1] [3, 2, 1]

疑问:为什么加了一个冒号就会连着一起改变

在作业的答案中老师说第一种是x,y是分开存储的,第二种z,m是同一个对象的不同命名。不太理解。因为在代码前两行不是已经确定了存储方式吗,在我的理解下第三行只是对其修改吧,为什么会影响到存储方式呢
感谢!
最佳答案
2023-3-25 19:26:38
在这两个例子中,存在两种不同的赋值方式,它们对变量之间的关系产生了不同的影响。

在第一个例子中:
x = [1,2,3]
y = x
x = x[::-1]


当我们执行 y = x 时,y 变量引用了与 x 相同的列表对象。但是,当我们执行 x = x[::-1] 时,我们创建了一个新的列表对象(一个反向的列表),并让 x 引用这个新的对象。此时,x 和 y 引用的是两个不同的对象,因此它们的值不会同时发生变化。

在第二个例子中:
z = [1,2,3]
m = z
z[:] = z[::-1]


当我们执行 m = z 时,m 变量引用了与 z 相同的列表对象。然后,当我们执行 z[:] = z[::-1] 时,我们使用切片操作 z[:] 直接修改了原始列表对象(不创建新对象)。因此,在这种情况下,z 和 m 仍然引用同一个对象,这个对象的内容已经被修改。这就是为什么在这个例子中,z 和 m 的值会同时发生变化。

总结一下,第一个例子中,x 和 y 分开存储是因为在执行 x = x[::-1] 时,创建了一个新的列表对象。而在第二个例子中,z 和 m 是同一个对象的不同命名,因为执行 z[:] = z[::-1] 时,直接修改了原始列表对象。切片操作 z[:] 是关键,它决定了是否创建新的列表对象还是直接修改原始列表对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-25 17:45:07 | 显示全部楼层
因为加了一个冒号就代表他从开始到结尾全部,但是也是列表的一部分,列表是自己的一部分,会变
但是不加冒号就代表列表这个整体,不是一部分,所以第二个不会变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-25 17:49:02 | 显示全部楼层
本帖最后由 sfqxx 于 2023-3-25 17:51 编辑

第一个:
因为y被赋值为[1,2,3],之后就没有被改变,x最终被赋值为[3,2,1]
所以会这样输出
第2个:
不加冒号就代表列表这个整体,不是一部分,所以第二个z, m一样
就像小甲鱼说的:z,m是同一个对象的不同命名
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-25 18:19:35 | 显示全部楼层
歌者文明清理员 发表于 2023-3-25 17:45
因为加了一个冒号就代表他从开始到结尾全部,但是也是列表的一部分,列表是自己的一部分,会变
但是不加冒 ...

请问是因为浅拷贝的原因吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-25 19:06:08 | 显示全部楼层
YJ_Li 发表于 2023-3-25 18:19
请问是因为浅拷贝的原因吗?

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

使用道具 举报

发表于 2023-3-25 19:26:38 | 显示全部楼层    本楼为最佳答案   
在这两个例子中,存在两种不同的赋值方式,它们对变量之间的关系产生了不同的影响。

在第一个例子中:
x = [1,2,3]
y = x
x = x[::-1]


当我们执行 y = x 时,y 变量引用了与 x 相同的列表对象。但是,当我们执行 x = x[::-1] 时,我们创建了一个新的列表对象(一个反向的列表),并让 x 引用这个新的对象。此时,x 和 y 引用的是两个不同的对象,因此它们的值不会同时发生变化。

在第二个例子中:
z = [1,2,3]
m = z
z[:] = z[::-1]


当我们执行 m = z 时,m 变量引用了与 z 相同的列表对象。然后,当我们执行 z[:] = z[::-1] 时,我们使用切片操作 z[:] 直接修改了原始列表对象(不创建新对象)。因此,在这种情况下,z 和 m 仍然引用同一个对象,这个对象的内容已经被修改。这就是为什么在这个例子中,z 和 m 的值会同时发生变化。

总结一下,第一个例子中,x 和 y 分开存储是因为在执行 x = x[::-1] 时,创建了一个新的列表对象。而在第二个例子中,z 和 m 是同一个对象的不同命名,因为执行 z[:] = z[::-1] 时,直接修改了原始列表对象。切片操作 z[:] 是关键,它决定了是否创建新的列表对象还是直接修改原始列表对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-26 14:42:20 | 显示全部楼层
isdkz 发表于 2023-3-25 19:26
在这两个例子中,存在两种不同的赋值方式,它们对变量之间的关系产生了不同的影响。

在第一个例子中:

十分感谢!
经过您的讲解已经完全理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 03:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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