有人可以解释这个表达式:a [len(a):] = [x]相当于list.append(x)

Aar*_*rdo 5 python list python-3.x

我正处于学习Python 3的最初阶段.了解语言基础知识.列表数据类型有一种方法:

list.append(x)
Run Code Online (Sandbox Code Playgroud)

在教程中,它被认为等同于这个表达式:

a[len(a):] = [x]
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个表达吗?我无法理解len(a):部分.这是一块片吗?从最后一项到最后一项?无法理解它.

我知道这是非常新手,对不起.我决定学习Python for Blender脚本和游戏引擎,并且想要了解所有构造.

Nad*_*ezo 13

回想切片是如何工作的:a[beginning:end].如果您不提供其中一个,那么您可以从中获取所有列表beginning或从中获取所有列表end.

这意味着如果我要求a[2:],我将从索引2一直到列表末尾获取列表,并且len(a)是在数组的最后一个元素之后的索引...所以a[len(a):]基本上是一个位于后面的空数组数组的最后一个元素.

假设你有a = [0,1,2],并且你做了a[3:] = [3,4,5],你告诉Python的是,就在[0,1,2之前和之后],应该有3,4,5.因此a将成为[0,1,2,3,4,5]并且在该步骤之后a[3:]确实将等同于[3,4,5]您声明的那样.

编辑:正如chepner评论的那样,任何大于或等于的索引len(a)都可以正常工作.例如,a = [0,1,2]a[42:] = [3,4,5]将导致a成为[0,1,2,3,4,5].

  • 值得注意的是,边界检查不适用于切片; `a [x:] == []`for*all*`x> = len(a)`. (2认同)

Jim*_*ard 5

一个通常可以指出l[len(l):] = [1]类似append,而这正是在文档中阐明,但是,这是一个特殊的情况下,只有当右手边的是成立有一个单一的元素.

在更一般的情况下,更安全地说它等同于extend以下原因:

Append接受一个对象并将其追加到最后; 使用切片分配,您可以在右侧扩展具有给定iterable的列表:

l[len(l):] = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

相当于:

l.extend([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

相同的参数append将导致[1, 2, 3]作为对象附加在末尾l.在这种情况下len(l),只是用于在列表的末尾执行扩展l.

一些例子来说明它们的区别:

l = [1, 2]
l[len(l):] = [1, 2]   # l becomes [1, 2, 1, 2]
l.extend([1, 2])      # l becomes [1, 2, 1, 2, 1, 2]
l.append([1, 2])      # l becomes [1, 2, 1, 2, 1, 2, [1, 2]]
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,l.append(<iterable>)实际上并未将每个值附加到iterable中,它会附加迭代本身.