需要解释此代码

时间:2015-10-02 09:52:29

标签: python

n1, n2, n3 = (n + [None]*2)[:3]

我只是非常想知道这是做什么的,这是如何工作的。 这是一个列表理解,只要我提供一个列表或具有足够变量的iterable,它会分配n1 = iterable [0]吗?

为什么括号末尾的[:3]会限制长度?

我理解为什么[无]存在,以防n的长度小于3但是有人可以给我更多信息吗?

我只编写了大约一周的时间,需要一些帮助解释。

2 个答案:

答案 0 :(得分:7)

如果n元素少于三个,则会使用None的前三个元素填充(n + [None]*2)

[None, None]n的列表连接到列表[:3],正如您所说,n1获取结果列表的前三项。然后将这三个项目解压缩到变量n2n3In [1]: n = ['One', 'Two'] In [2]: n1, n2, n3 = (n + [None]*2)[:3] In [3]: print n1 One In [4]: print n2 Two In [5]: print n3 None

例如:

n

但如果n1中有三个或更多项,那么您只需将这三个项目设为n2n3n

正如其他人在下面提到的那样,如果(n + [None]*2)是空列表,则此代码将失败,因为(n + [None]*2)[:3]只有两个项目。它可以被切片OK:ValueError返回包含这两个项的列表,但是然后解压缩到三个变量失败。在这种情况下得到的n1, n2, n3 = (n + [None]*3)[:3]是否是要引发的预期异常,或者代码是否应该None以便将 public interface IUserProvider { string GetUserId(); string GetUserName(); } 返回到每个变量中,这只是原始程序员知道的事情。这通常需要在代码中发表评论。

答案 1 :(得分:3)

这不是列表理解。据推测,n是一个列表,or anything that can be the left-operand of concatenation by the + operator when called with the suitable right-operand, under suitable implementation of __add__ or __radd__。列表上的+运算符将它们连接在一起以创建新列表,而[:3]部分只是用于获取列表切片的语法糖。你真的应该查看documentation