列出Python中的操作

时间:2014-04-18 21:27:08

标签: python

我有两个数组

x=[1,2,3]
y=[1,-2,3]

我想计算标量积(x | y)和y

的范数l1

我不明白为什么以下代码有效:

y_norm=sum([abs(u) for u in y])
scal_prod=sum([y * x for y, x in zip(y,x)])

但是,如果我先用我的代码计算标量积,那就不会:

scal_prod=sum([y * x for y, x in zip(y,x)])
y_norm=sum([abs(u) for u in y])

根据消息错误,对于第二个版本,y是一个整数。 事实上,如果我返回y的类型,它已被更改为整数。

究竟发生了什么? 提前致谢

2 个答案:

答案 0 :(得分:1)

当您运行此行时:

scal_prod=sum([y * x for y, x in zip(y,x)])

您迭代列表中的元素,并为yx分配整数值。因此y不再引用您的列表。例如,尝试以下操作,您应该没问题:

scal_prod=sum([a * b for a, b in zip(y,x)])

这一次,您使用ab进行迭代,因此y仍然引用原始列表[1,-2,3]。现在,因此,你的第二行应该有用。

答案 1 :(得分:1)

执行list comprehension重新绑定标签y,因为你将它用作变量:

scal_prod=sum([y * x for y, x in zip(y,x)])

执行完毕后,y现在引用原始列表y的最后一个元素。

使用不同的变量名来避免这种情况。