Python docs说分割列表会返回一个新的列表。
现在,如果返回一个“新”列表,我有以下关于“对切片的赋值”的问题。
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
现在,输出将是:
[4, 5, 3]
我读了文档,它说这是可能的,既然切片一个列表会返回一个“新的”列表,为什么原来的列表被修改了?,expression?
发布于 2012-05-17 01:09:25
您混淆了两个使用非常相似语法的不同操作:
1)切片:
b = a[0:2]
这将创建a
切片的副本并将其分配给b
。
2)切片分配:
a[0:2] = b
这将用b
的内容替换a
的切片。
尽管语法相似(我想象一下是故意的!),但这是两种不同的操作。
发布于 2012-05-17 01:12:12
当您在=
运算符的左侧指定a
时,您将使用Python的normal assignment,它会将当前上下文中的名称a
更改为指向新值。这不会更改a
所指向的前一个值。
通过在Python运算符的左侧指定a[0:2]
,可以告诉=
您希望使用slice assignment。切片分配是一种特殊的列表语法,您可以在其中插入、删除或替换列表中的内容:
插入
>>> a = [1, 2, 3]
>>> a[0:0] = [-3, -2, -1, 0]
>>> a
[-3, -2, -1, 0, 1, 2, 3]
删除
>>> a
[-3, -2, -1, 0, 1, 2, 3]
>>> a[2:4] = []
>>> a
[-3, -2, 1, 2, 3]
替换
>>> a
[-3, -2, 1, 2, 3]
>>> a[:] = [1, 2, 3]
>>> a
[1, 2, 3]
注意:
如果目标序列允许的话,片段的长度可以不同于所分配序列的长度,从而改变目标序列的长度。-
切片赋值提供了类似于tuple unpacking的功能。例如,a[0:1] = [4, 5]
等同于:
# Tuple Unpacking
a[0], a[1] = [4, 5]
使用元组解包,您可以修改非顺序列表:
>>> a
[4, 5, 3]
>>> a[-1], a[0] = [7, 3]
>>> a
[3, 5, 7]
但是,元组解包仅限于替换,因为您不能插入或删除元素。
在所有这些操作之前和之后,a
都是相同的列表。Python只是提供了很好的语法糖来就地修改列表。
发布于 2016-02-26 00:26:07
我之前遇到过同样的问题,这与语言规范有关。根据assignment-statements的说法,
__setitem__
。a[i] = x
等同于a.__setitem__(i, x)
.a.__setitem__(slice(1,4,None), [1,2,3])
,a[i] = x
也会调用__setitem__
,但参数不同:a[1:4]=[1,2,3]
等同于slice
这就是'=‘左边的列表切片表现不同的原因。
https://stackoverflow.com/questions/10623302
复制相似问题