首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >赋值如何处理列表切片?

赋值如何处理列表切片?
EN

Stack Overflow用户
提问于 2012-05-17 01:05:14
回答 5查看 59.1K关注 0票数 115

Python docs说分割列表会返回一个新的列表。

现在,如果返回一个“新”列表,我有以下关于“对切片的赋值”的问题。

代码语言:javascript
复制
a = [1, 2, 3]
a[0:2] = [4, 5]
print a

现在,输出将是:

代码语言:javascript
复制
[4, 5, 3] 

我读了文档,它说这是可能的,既然切片一个列表会返回一个“新的”列表,为什么原来的列表被修改了?,expression?

  • Yes,,,
  1. ?我不能理解它背后的机制。
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-17 01:09:25

您混淆了两个使用非常相似语法的不同操作:

1)切片:

代码语言:javascript
复制
b = a[0:2]

这将创建a切片的副本并将其分配给b

2)切片分配:

代码语言:javascript
复制
a[0:2] = b

这将用b的内容替换a的切片。

尽管语法相似(我想象一下是故意的!),但这是两种不同的操作。

票数 136
EN

Stack Overflow用户

发布于 2012-05-17 01:12:12

当您在=运算符的左侧指定a时,您将使用Python的normal assignment,它会将当前上下文中的名称a更改为指向新值。这不会更改a所指向的前一个值。

通过在Python运算符的左侧指定a[0:2],可以告诉=您希望使用slice assignment。切片分配是一种特殊的列表语法,您可以在其中插入、删除或替换列表中的内容:

插入

代码语言:javascript
复制
>>> a = [1, 2, 3]
>>> a[0:0] = [-3, -2, -1, 0]
>>> a
[-3, -2, -1, 0, 1, 2, 3]

删除

代码语言:javascript
复制
>>> a
[-3, -2, -1, 0, 1, 2, 3]
>>> a[2:4] = []
>>> a
[-3, -2, 1, 2, 3]

替换

代码语言:javascript
复制
>>> a
[-3, -2, 1, 2, 3]
>>> a[:] = [1, 2, 3]
>>> a
[1, 2, 3]

注意:

如果目标序列允许的话,片段的长度可以不同于所分配序列的长度,从而改变目标序列的长度。-

切片赋值提供了类似于tuple unpacking的功能。例如,a[0:1] = [4, 5]等同于:

代码语言:javascript
复制
# Tuple Unpacking
a[0], a[1] = [4, 5]

使用元组解包,您可以修改非顺序列表:

代码语言:javascript
复制
>>> a
[4, 5, 3]
>>> a[-1], a[0] = [7, 3]
>>> a
[3, 5, 7]

但是,元组解包仅限于替换,因为您不能插入或删除元素。

在所有这些操作之前和之后,a都是相同的列表。Python只是提供了很好的语法糖来就地修改列表。

票数 77
EN

Stack Overflow用户

发布于 2016-02-26 00:26:07

我之前遇到过同样的问题,这与语言规范有关。根据assignment-statements的说法,

  1. 如果赋值的左侧是subscription,则Python将对该对象调用__setitem__a[i] = x等同于a.__setitem__(i, x).
  2. If赋值的左侧是a.__setitem__(slice(1,4,None), [1,2,3])

a[i] = x也会调用__setitem__,但参数不同:a[1:4]=[1,2,3]等同于slice

这就是'=‘左边的列表切片表现不同的原因。

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10623302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档