我有两个数组
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的类型,它已被更改为整数。
究竟发生了什么? 提前致谢
答案 0 :(得分:1)
当您运行此行时:
scal_prod=sum([y * x for y, x in zip(y,x)])
您迭代列表中的元素,并为y
和x
分配整数值。因此y
不再引用您的列表。例如,尝试以下操作,您应该没问题:
scal_prod=sum([a * b for a, b in zip(y,x)])
这一次,您使用a
和b
进行迭代,因此y
仍然引用原始列表[1,-2,3]
。现在,因此,你的第二行应该有用。
答案 1 :(得分:1)
执行list comprehension重新绑定标签y
,因为你将它用作变量:
scal_prod=sum([y * x for y, x in zip(y,x)])
执行完毕后,y
现在引用原始列表y
的最后一个元素。
使用不同的变量名来避免这种情况。