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 功能时它会以这种方式工作。
这是一个经过深思熟虑的功能,一个特性,您可以通过这种方式连续迭代多个列表吗?有点?
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 功能时它会以这种方式工作。
这是一个经过深思熟虑的功能,一个特性,您可以通过这种方式连续迭代多个列表吗?有点?
您已经有了很好的答案,但我认为考虑这种等效变化将有助于使其更清晰:
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
部分不那么明显。
哦,伙计,这是一团糟。这只是对 python 的可迭代解包的过多使用。该语句a, b, c = iterable
只是将 的元素分配给iterable
变量a
、b
和c
。在这种情况下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)
.
它的代码非常直接。
这会将三个列表分配给x
、y
和z
。
x,y,z = [1,2,3], [4,5,6], [7,8,9]
这将创建一个元组(x,y,z)
并将迭代每个元素。
for a,b,c in x,y,z:
然而,这a,b,c
意味着可迭代对象有 3 个对象
然后,这将打印a
,b
和c
。
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
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
。将它们的内容分别分配给,和; 即, , 。
最终,这变成y
z
a
b
c
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)
这是一个不寻常的蟒蛇。元组的隐式创建。
在这里,您在右侧创建一个匿名元组
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 中打字。
一切都在这里解释: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)
看起来你有 3 个数组
x = [1,2,3]
y = [4,5,6]
z = [7,8,9]
a,b,c 表示每个数组中的元素。所以看起来 for 循环正在迭代 3 个数组并将元素映射到 a、b 和 c。然后打印出来。再说一次,我不知道python