2013-10-16 120 views
7
x,y,z = [1,2,3], [4,5,6], [7,8,9] 
for a,b,c in x,y,z: 
    print(a,b,c) 

输出是:这段代码是怎么回事?

1 2 3 
4 5 6 
7 8 9 

我不能精神上导航任何逻辑是怎么回事这里产生这种输出。我知道压缩函数使得这个代码按照我明确打算的方式工作;但我只是试图了解为什么它在你不使用zip函数时以这种方式工作。

这是一个故意的功能,一个功能,你可以连续迭代多个列表这种方式吗?有点?

+2

“我明确打算的方式”?大声笑 - 我不知道你打算在这里;-) –

+2

我猜OP要'1 4 7'等 –

回答

8

你有很好的答案了,但我认为考虑到这相当于变化将有助于更清楚:

x,y,z = [1,2,3], [4,5,6], [7,8,9] 
for t in x,y,z: 
    a, b, c = t 
    print(a,b,c) 

你并不感到惊讶,t连续势必xyz,对不对?正是同样的事情也发生在你的原代码,不同之处在于:

a, b, c = t 

部分就没有那么明显。 “我明确打算的方式”是什么?

+0

我不得不像三次阅读'a,b,c = t'(这听起来很奇怪),但之后它被点击了。 – Aerovistae

+1

太棒了!我认为这是混淆的真正根源,所以把它分解出来。现在,您再也不会对任何事情感到惊讶;-) –

+2

永远,在任何我选择探索的知识领域。我会永远记得今晚,这一切都为我转身。 – Aerovistae

6

哦,这人是一团糟。这只是使用python的iterable unpacking。声明a, b, c = iterable只是将iterable的元素分配给变量a,bc。在这种情况下iterable必须有3个元素。

首先,你必须:

x,y,z = [1,2,3], [4,5,6], [7,8,9] 
# Which is: 
x = [1, 2, 3] 
y = [4, 5, 6] 
z = [7, 8, 9] 

,那么你必须:

for a, b, c in x, y, z: 
    print(a, b, c) 
# Which is: 
temp = (x, y, z) 
for item in temp: 
    a = item[0] 
    b = item[1] 
    c = item[2] 
    print(a, b, c) 

还有一点要注意的是,声明mytuple = 1, 2, 3相同mytuple = (1, 2, 3)

+0

这个答案与蒂姆彼得斯的答案一起使它很清楚,谢谢。 – Aerovistae

2

真的很直接的代码。

  1. 这三个列表分配给xyz

    x,y,z = [1,2,3], [4,5,6], [7,8,9] 
    
  2. 这创建的(x,y,z)的元组,并且将各元素迭代。

    for a,b,c in x,y,z: 
    

    然而,a,b,c指iterables预期具有3个对象

  3. 然后,该打印abc

    print(a,b,c) 
    

如果你想看看发生了什么,我建议改变的要素之一y

x,y,z = [1,2,3], [3,4,5,6], [7,8,9] 
for a,b,c in x,y,z: 
    print(a,b,c) 

1 2 3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: too many values to unpack 

或者通过移除一个从x

x,y,z = [1,2], [4,5,6], [7,8,9] 
for a,b,c in x,y,z: 
    print(a,b,c) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 2 values to unpack 
+0

随着蒂姆的回答,我最好清楚,最后一个例子非常有帮助。 –

0

看起来你有3个阵列

x = [1,2,3] 
y = [4,5,6] 
z = [7,8,9] 

和a,b,c代表每个阵列中的元素。所以它看起来像for循环遍历3个数组并将元素映射到a,b和c。然后打印出来。再说,我不知道蟒蛇

1

一切都在这里解释:http://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences

第一部分是认识到逗号隐式创建的元组。因此,第一行是等同于:

x,y,z = ([1,2,3], [4,5,6], [7,8,9]) 

这也意味着你的for循环相当于:

for a,b,c in ([1,2,3], [4,5,6], [7,8,9]): 

第二部分理解的是序列拆封。这意味着如果您分配了一个长度为nn变量的序列,Python会适当地分配序列中的项目。所以第一部分实际上是:

x = [1,2,3] 
y = [4,5,6] 
z = [7,8,9] 

而且for循环是一样的:

for t in (x,y,z): 
    a = t[0] 
    b = t[1] 
    c = t[2] 
    print(a,b,c) 
2
x,y,z = [1,2,3], [4,5,6], [7,8,9] 

是等于说

x = [1,2,3] 
y = [4,5,6] 
z = [7,8,9] 

下一页

for a,b,c in x,y,z: 

相当于

for a,b,c in [x,y,z]: 

这只是说:“取反过来xyz。将其内容分别分配到a,bc;即a=x[0],b=x[1],c=x[2]
最终,这变成

a,b,c = x 
print(a,b,c) 
a,b,c = y 
print(a,b,c) 
a,b,c = z 
print(a,b,c) 
+0

很有帮助,但我认为'对于a,b,c in [x,y,z]:'应该被写为'for a,b,c in(x,y,z):',我的意思是元组而不是列表,不是? –

2

这是一个不寻常的蟒蛇的事情。隐式创建元组。

a, b = 1, 2 

是一样的::

在这里,你在正确的

x,y,z = [1,2,3], [4,5,6], [7,8,9] 

这是一个类似的代码创建一个匿名元组

a, b = (1, 2) 

a = 1 
    b = 2 

它允许一个普通的python trick(idiom)。您可以交换价值没有一个临时变量:

a, b = b, a 

同样的情况,互动的词典的键和值:

for i, j in my_dict.items(): 
    print i, j 

在代码中,在创建for循环的另一个临时元组:

for a,b,c in (x,y,z): 
    print(a,b,c) 

这意味着:

for a, b,c in ([1,2,3], [4,5,6], [7,8,9]): 
    print(a,b,c) 

换句话说:重写这段代码更清晰。 Python并没有遵循自己的口头禅:显式比隐式更好。

顺便说一句,请参阅有趣的Python Zen在Python shell中输入import this