lzb1001 发表于 2023-4-29 00:14:43

还是赋值 vs 分片拷贝

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

>>> old =
>>> new = old
>>> new

>>> old =
>>> new
# 现在可以理解了

>>> old[:] = # 与old = 有何不同?
>>> old

>>> new
# 还是保持不变,但按我上一个问题中“歌者文明清理员”的解答不是应该返回才对吗?

>>> new = old
>>> old[:] =
>>> old

>>> new # 这里返回值怎么就变了?

isdkz 发表于 2023-4-29 00:16:34

在这个例子中,我们比较了两种不同的赋值方式:直接赋值和分片拷贝。首先解释一下两种赋值方式的区别:

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

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

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

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

总结:直接赋值和分片拷贝的主要区别在于它们操作对象的方式。直接赋值只是复制引用,而分片拷贝创建一个新的列表副本。在上述示例中,你可以看到这种区别如何影响代码的执行结果。

歌者文明清理员 发表于 2023-4-29 00:23:12

在old=这一步,old和new已经是两个变量了,已经分开了
应该再加上一行:
new=old

lzb1001 发表于 2023-4-29 01:06:41

歌者文明清理员 发表于 2023-4-29 00:23
在old=这一步,old和new已经是两个变量了,已经分开了
应该再加上一行:

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

>>> new
页: [1]
查看完整版本: 还是赋值 vs 分片拷贝