在上一节Python入门教程: 计算范德蒙矩阵的行列式 我写程序中踩了一个坑。 就是变量的赋值与数组的赋值的效果是不一样的。
变量的赋值
大家先预测下下面代码的输出:
# set value for variable
a = 'a'
b = a
a = 'b'
print('a=', a, 'b=', b)
我想, 稍微有点编程经验的都应该猜到输出为
a= b b= a
恭喜, 那么你能否成功闯关下面的数组赋值呢?
数组的赋值
# set value for list
alist = ['a', 'b', 'c']
blist = alist
alist[0] = 'd'
print('alist=', alist, 'blist=', blist)
哈哈, 我想大多数人都猜不到, 输出结果为
alist= ['d', 'b', 'c'] blist= ['d', 'b', 'c']
其实, 当你写blist=alist
的时候, python只是将alist
这个指针复制给blist
, 也即他们两个指向同一个数据块, 即数组:['a', 'b', 'c']
。 这时你既可以可以通过alist
这个指针来访问数组, 也可以通过blist
来访问。 故你改变alist
的时候, 你其实改变的是alist
指向的数据, 此时blist
也随着改变了。这点其实和C语言很像。
数组的复制
所以, 原理清楚了, 那么如何打破这种状态呢?我们不需要blist
随着alist
的改变而改变。其基本想法是
将
alist
指向的数组复制到blist
这可由两种方法实现:
# copy list: method 1
blist=[ el for el in alist ]
# copy list: method 2
blist=alist.copy()
看到了吗, 第一种方法其实就是用一个for
遍历alist
中元素, 而第二种是python内置的copy()
函数。
好了, 大家现在应该能看懂上一节计算行列式中如下的一行代码了吧?
sM=[rM.copy() for rM in M]
这里, 本质在于我们是二维数组。你自己多试验下, 如果用sM=M.copy()
, 然后改变M
的值, sM
的值如何改变?
不知大家是否和我一样, 愿意像这样在实践中学习呢?