这两条线有什么区别?

friends = my[:] #1
friends[:] = my #2

两个变量都可以是列表或字符串,即可迭代的。我正在学习蟒蛇。

  1. 我不明白这些线路是如何工作的。你能解释更多关于它们的信息吗?
  2. 两条线有什么区别?

回答

第一行重新绑定 friends到一个新序列,它是一个浅拷贝my(实际上,它可以做任何事情,但假设my不是memoryviewnumpy数组这样的奇怪的第三方类型,那通常是整个序列的浅拷贝)。

第二行重新分配内容friends(必须是可变的),以无论是在迭代my(再次,奇怪的覆盖friends可以改变这一点); my不一定是一个序列,一个普通的迭代器也可以工作,并且会在填充的过程中耗尽friends

在这两种情况下,它都是一个浅拷贝(my在任何一行都不会改变之后重新分配或附加/弹出元素friends)。主要区别在于第一行是对新序列的重新绑定,而后者则发生了变化friends。这在两个方面很重要:

  1. 别名:如果任何其他名称绑定到与 相同的序列friends,则第一个选项不会影响别名(重新绑定会丢弃旧引用,因此其他别名保留它,friends不会),而第二个选项会修改其他别名
  2. 类型保留:第二个选项不会改变 的类型friends,它只是替换内容。第一个选项不关心过去是什么friends(它可能是像 那样的非序列int),它最终会成为切片产生的任何东西(例如,如果my是 a list,则friends变成 alist之后)。

使用此设置的具体示例:

friends = [1, 2, 3]
alsofriends = friends
my = (4, 5, 6)

如果您使用第 1 行,则在该行之后friends是 is(4, 5, 6)alsofriendsis 仍然[1, 2, 3](不再与此相关friends)。

如果您使用第 2 行,那么在该行之后,friends[4, 5, 6](内容来自my,但仍然是 a list),alsofriends现在[4, 5, 6]也是(它仍然是 的别名friends,并且共享的内容与list从 复制的内容相匹配my)。


以上是这两条线有什么区别?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>