Python的list乘法【巨坑】

Python018

Python的list乘法【巨坑】,第1张

模式识别要求写混合属性相异性矩阵的算法,我用python语言来写的。

里面二元矩阵的初始化我直接用的list的乘法,看起来没什么问题。。初始化完是d = [[0,0,0],[0,0,0],[0,0,0]]

但是判断l[0]和l[1]不同之后,除了d[1][0]之外,d[0][0]和d[2][0]都变成了1!

*操作符在实现上是复制了值的引用,而不是创建了新的对象。所以list的三个item指向的是同一个地址!

*操作符对于不可变对象是安全的,对于可变对象要小心。

而python里list是可变对象,tuple是不可变对象。

将上述初始化声明换成以下就ok了

# -*- coding:utf-8 -*-

#py3

'''

用高级函数reduce()

'''

from functools import reduce

lis=[1,2,3,4,5]

r=reduce(lambda x,y:x*y,lis)#对序列lis中元素逐项相乘lambda用法请自行度娘

print(r)

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

比方说对一个序列求和,就可以用reduce实现,比如:

from functools import reduce

def add(x,y):

    return x+y

reduce(add,[1,2,3])

#结果是6

1、代码一

>>> from functools import reduce

>>> reduce(lambda x,y:x*y,[1,2,3,2,2])

24

2、代码二

lst = [1, 2, 3, 4, 5]

num = 1

for i in lst:

num *= i

print num

扩展资料:

控制语句

if语句,当条件成立时运行语句块。经常与else, elif(相当于else if) 配合使用。

for语句,遍历列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。

while语句,当条件为真时,循环运行语句块。

try语句,与except,finally配合使用处理在程序运行中出现的异常情况。

class语句,用于定义类型。

def语句,用于定义函数和类型的方法。

pass语句,表示此行为空,不运行任何操作。

assert语句,用于程序调试阶段时测试运行条件是否满足。

with语句,Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加密,然后在语句块运行退出后解密。

参考资料来源:百度百科-Python (计算机程序设计语言)