gpt4 book ai didi

python - 为什么 b[ :]=a mutates list b?

转载 作者:行者123 更新时间:2023-12-01 15:22:44 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How does assignment work with list slices?

(5 个回答)


2年前关闭。




假设我们有一个列表 a=[1,2,3]我需要复制 a 的元素到新列表 b .

我们可以做a=b但两者都是 ab指向同一个列表。因此,改变其中任何一个都会改变两个列表。

>>> a=b
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> b.append(4)
>>> a,b
([1, 2, 3, 4], [1, 2, 3, 4])
>>> a.append(5)
>>> a,b
([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
>>> a is b
True
>>> id(a),id(b)
(2287659980360, 2287659980360)

为了避免这种情况,我们可以做 b=a[:] . a[:]使用相同的 a 值创建一个不同的列表.现在,即使我变异 a , b不会受到影响,反之亦然。 bb[:]是两个不同的列表。
>>> b=a[:]
>>> a,b
([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
>>> a.append(6)
>>> a,b
([1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5])
>>> b.append(6)
>>> a,b
([1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6])
>>> a is b
False
>>> id(a),id(b)
(2287659980360, 2287653308552)

现在,如果我这样做 b[:]=a我的 list b正在变异。但是 b[:]另一个列表对吗?两个 bb[:]指向不同的列表对吗?如我错了请纠正我。为什么是 b如果我变异 b[:] 会被改变.我错过了什么?
>>> a=['a','b','c']
>>> b[:]=a
>>> a,b
(['a', 'b', 'c'], ['a', 'b', 'c'])
>>> id(b),id(b[:])
(2287653308552, 2287660267080)
>>> b is b[:]
False

最佳答案

当用作表达式或分配目标时,切片意味着不同的东西。

作为表达式,计算 b[:]生成一个新列表。但是,作为分配目标,分配给 b[:]并不意味着“评估表达式 b[:] 然后分配给结果列表”。无论如何,您不能分配给 Python 中的对象。

作为分配目标,分配给 b[:]告诉现有列表用您分配给 b[:] 的任何元素替换其内容.这由 __setitem__ 处理。方法,例如 b.__setitem__(slice(None, None), a) .没有新的列表产生,b[:]不作为表达式计算。

您可以在 language reference documentation 中看到这一点。对于赋值语句,在“如果目标是切片”下(尽管切片赋值的一些约束并不像文档描述的那样严格;例如,文档说序列类型需要匹配,但对于大多数类型,他们没有)。

关于python - 为什么 b[ :]=a mutates list b?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59748590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com