n1, n2, n3 = (n + [None]*2)[:3]
我只是非常想知道这是做什么的,这是如何工作的。 这是一个列表理解,只要我提供一个列表或具有足够变量的iterable,它会分配n1 = iterable [0]吗?
为什么括号末尾的[:3]会限制长度?
我理解为什么[无]存在,以防n的长度小于3但是有人可以给我更多信息吗?
我只编写了大约一周的时间,需要一些帮助解释。
答案 0 :(得分:7)
如果n
元素少于三个,则会使用None
的前三个元素填充(n + [None]*2)
。
[None, None]
将n
的列表连接到列表[:3]
,正如您所说,n1
获取结果列表的前三项。然后将这三个项目解压缩到变量n2
,n3
和In [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
中有三个或更多项,那么您只需将这三个项目设为n2
,n3
和n
。
正如其他人在下面提到的那样,如果(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。