今天debug的时候发现了Python 二维list初始化的一个坑。
一开始我是这样初始化二维数组的:
matrix = [[0 for _ in xrange(MAX_COL)] for _ in xrange(MAX_ROW)]
后来发现这样好傻,于是改成下面这样:
matrix = [[0] * MAX_COL] * MAX_ROW
毕竟这样看起来优雅。哪知道这里面有个巨大的坑:第二维的list是浅拷贝而不是深拷贝,导致一改就是一列!所有的matrix[i]都指向同一个list对象。当你改写matrix[0][0]的值的时候,matrix[1][0]的值也被改了!
Python文档链接:
https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range
Python的这个设定是有点问题的。虽然矩阵运算这种东西应该避免在Python中做,但作为一种变成语言,这种语法便利性还是要提供的。不然要用循环推导去初始化二维数组也太蛋疼了。
C函数覆盖的问题直接看知乎吧:
https://www.zhihu.com/question/68006017/answer/258835150
看来大牛也有混淆系统调用和libc的时候呀: P
网友评论