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 函数可以使这段代码按照我明确的意图运行;但我只是想了解为什么当您不使用 zip 功能时它会以这种方式工作。

这是一个经过深思熟虑的功能,一个特性,您可以通过这种方式连续迭代多个列表吗?有点?

4

7 回答 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依次绑定x,y和,你不会感到惊讶z,对吧?完全相同的事情发生在您的原始代码中,除了:

a, b, c = t

部分不那么明显。

于 2013-10-16T04:51:52.770 回答
6

哦,伙计,这是一团糟。这只是对 python 的可迭代解包的过多使用。该语句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).

于 2013-10-16T04:42:51.233 回答
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. 然后,这将打印a,bc

        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
于 2013-10-16T04:44:08.627 回答
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]:

它只是说“依次取, x。将它们的内容分别分配给,和; 即, , 。 最终,这变成yzabca=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)
于 2013-10-16T04:45:22.627 回答
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 Zenimport this在 Python shell 中打字。

于 2013-10-16T04:45:39.177 回答
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)
于 2013-10-16T04:45:01.443 回答
0

看起来你有 3 个数组

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

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

于 2013-10-16T04:44:44.110 回答