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功能时它会这样工作。
这是一个有意识的功能,一个功能,您可以通过这种方式连续迭代多个列表吗?排序?
答案 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
先后被x
,y
和z
绑定,你并不感到惊讶,对吗?除了以下内容之外,您的原始代码完全相同:
a, b, c = t
部分不那么明显。
答案 1 :(得分:6)
哦,男人,这是一团糟。这只是对python iterable unpacking的过多使用。声明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)
相同。
答案 2 :(得分:2)
它非常直接的代码。
这会将三个列表分配给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
答案 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]:
只是说“依次”x
,y
和z
。分别将内容分配到a
,b
和{{1} } {ie c
,a=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