这段代码发生了什么?

时间:2013-10-16 04:40:14

标签: python python-3.x

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函数使这段代码按照我明确的意图行事;但是我只是试图理解为什么当你不使用zip功能时它会这样工作。

这是一个有意识的功能,一个功能,您可以通过这种方式连续迭代多个列表吗?排序?

7 个答案:

答案 0 :(得分: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

部分不那么明显。

答案 1 :(得分:6)

哦,男人,这是一团糟。这只是对python iterable unpacking的过多使用。声明a, b, c = iterable只是将iterable的元素分配给变量abc。在这种情况下,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, 3mytuple = (1, 2, 3)相同。

答案 2 :(得分: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意味着迭代物应该有3个对象

  3. 然后,这会打印abc

        print(a,b,c)
    
  4. 如果你想看看发生了什么,我建议改变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
    

答案 3 :(得分: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。分别将内容分配到ab和{{1} } {ie ca=x[0]b=x[1]
最终,这变成了

c=x[2]

答案 4 :(得分:2)

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

在这里,您可以在右侧创建一个匿名元组

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

这是一个类似的代码:

a, b = 1, 2

是一样的:

a, b =  (1, 2)

   a = 1
   b = 2

它允许一个常见的python技巧(成语)。您可以在没有临时变量的情况下交换值:

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

答案 5 :(得分: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]):

要理解的第二部分是序列解包。这意味着如果您将一个长度为n的序列分配给n变量,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)

答案 6 :(得分:0)

看起来你有3个阵列

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

和a,b,c表示每个数组中的元素。所以看起来for循环迭代3个数组并将元素映射到a,b和c。然后将它们打印出来。然后,我不知道python