Python : 使用 zip 函数从循环中提取一个迭代表达式

Python : Extract one iteration expression from a loop with zip function

在 python3 中,我有以下循环:

for c,z in zip(ax.collections, [0.6, 0.8, 2, 0.7, 0.9, 2]):
  c.zorder = z

我不明白为什么单次迭代不正确:

ax.collections.zorder = [0.6, 0.8, 2, 0.7, 0.9, 2]

?

谁能解释一下语法不正确的原因?这肯定是由于 zip 功能。

ax.collections 是某种形式的可迭代,所涉及的 list 文字也是如此。 zip 循环将 list 文字中的单个值分配给 ax.collections 中单个值的 zorderax.collections 本身可能根本没有 zorder 属性,即使它有,其中的值也不会知道它。

要使单个迭代正确(假设 ax.collections 是一个序列,而不是任意可迭代对象),您需要:

ax.collections[0].zorder = 0.6
# look up elem^^^          ^^^ assign single value to its attribute

ax.collections 本身没有被修改(只有其中的一项),并且只分配了 list 中的一个值。如果它有助于理解它,对于您示例中的序列,可以认为 zip 的行为类似于索引上的这个 unPythonic 循环:

mylist = [0.6, 0.8, 2, 0.7, 0.9, 2]
for i in range(min(len(ax.collections), len(mylist))):
    c = ax.collections[i]
    z = mylist[i]
    c.zorder = z

只是 zip 循环明显更快,并且适用于任何可迭代的,而不仅仅是可索引的序列(并且不需要输入有名称,就像上面示例中的索引一样)。