这两条线有什么区别?
friends = my[:] #1
friends[:] = my #2
两个变量都可以是列表或字符串,即可迭代的。我正在学习蟒蛇。
- 我不明白这些线路是如何工作的。你能解释更多关于它们的信息吗?
- 两条线有什么区别?
回答
第一行重新绑定 friends到一个新序列,它是一个浅拷贝my(实际上,它可以做任何事情,但假设my不是memoryview像numpy数组这样的奇怪的第三方类型,那通常是整个序列的浅拷贝)。
第二行重新分配的内容的friends(必须是可变的),以无论是在迭代my(再次,奇怪的覆盖friends可以改变这一点); my不一定是一个序列,一个普通的迭代器也可以工作,并且会在填充的过程中耗尽friends。
在这两种情况下,它都是一个浅拷贝(my在任何一行都不会改变之后重新分配或附加/弹出元素friends)。主要区别在于第一行是对新序列的重新绑定,而后者则发生了变化friends。这在两个方面很重要:
- 别名:如果任何其他名称绑定到与 相同的序列
friends,则第一个选项不会影响别名(重新绑定会丢弃旧引用,因此其他别名保留它,friends不会),而第二个选项会修改其他别名 - 类型保留:第二个选项不会改变 的类型
friends,它只是替换内容。第一个选项不关心过去是什么friends(它可能是像 那样的非序列int),它最终会成为切片产生的任何东西(例如,如果my是 alist,则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)。