为了账号安全,请及时绑定邮箱和手机立即绑定

为什么逗号分隔的可迭代对象不能像 zip 一样工作?

为什么逗号分隔的可迭代对象不能像 zip 一样工作?

白板的微信 2021-09-11 20:13:55
我想了解的是为什么下面的代码for x, y in [1,2], [3,4]:    print(x, y, x + y)印刷1 2 33 4 7代替1 3 42 4 6现在,我知道 zip 可以完成这项工作,并且不使用 zip 迭代一对列表可以被视为反模式,但我仍然需要对这种默认行为进行解释。在我看来,上面的代码应该像内置的 zip 函数一样直观地工作for (x, y) in zip([1,2], [3,4]):    print(x, y, x + y)哪个打印1 3 42 4 6从记忆中我记得很久以前看到过对这种技术的解释(我想这就是为什么首先想到这个解决方案的原因),但我现在已经进行了搜索,包括 Python 3 文档的整个第 5 部分,但我不能'找不到对这种行为的任何解释,甚至在第 5.6 节中也找不到。(循环技巧)。这是第四个陷阱吗?
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

我认为这是预期的行为!

认为这[1,2], [3,4]是一个元组文字,相当于 tuple ([1,2], [3,4])。(您可能会在没有注意到的情况下使用它,例如在a, b, c = 10, 20, 30不考虑()... 的情况下分配多个值时)。


因此,在您的示例中,循环按如下方式遍历此列表:


# First iteration we get:

x, y = [1, 2]  

# Which is the same as:

x = 1

y = 2

# Which would print:

print(x, y, x+y)

>> 1, 2, 3


# Second iteration we get:

x, y = [3, 4]  

# Which is the same as:

x = 3

y = 4

# Which would print:

print(x, y, x+y)

>> 3, 4, 7  

现在更有意义了吗?


考虑 zip:如果 zip 会做同样的事情,那么我会怀疑!怎么会有这种非常常见且被认为有用但完全多余的东西?没有人注意到吗?所以你不应该期望他们做同样的事情!;-)


由于要求提供指向文档的指针而进行编辑。

从5.3 元组和序列:


元组由许多用逗号分隔的值组成,例如: ...

正如您所见,输出元组总是括在括号中,以便正确解释嵌套的元组;它们可以带或不带括号输入,尽管通常无论如何都需要括号(如果元组是更大表达式的一部分)。


查看完整回答
反对 回复 2021-09-11
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

理解第一个行为的直观方法是考虑

for x, y in [1,2], [3,4]:

作为分解

for z in [[1,2],[3,4]]:

在哪里

z[0] = [1,2]
z[1] = [3,4]


查看完整回答
反对 回复 2021-09-11
?
开满天机

TA贡献1786条经验 获得超12个赞

看这个:


>>> [1,2],[3,4]

([1, 2], [3, 4])

>>> list(zip([1,2],[3,4]))

[(1, 3), (2, 4)]

>>> 

结果是不同的,所以当你像这样迭代时:


for x,y in [1,2],[3,4]:

    ...

它会是这样的:


x=1

y=2

# next loop

x=3

y=4

当循环是:


for x,y in zip([1,2],[3,4]):

    ...

它像这样迭代:


x=1

y=3

# next loop

x=2

y=4

这就是 Python 创建zip方法的原因。


查看完整回答
反对 回复 2021-09-11
  • 3 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信