python 入门

Python入门教程: 变量与数组的赋值

2017-11-07  本文已影响8人  破旧的大卡车

在上一节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的值如何改变?

不知大家是否和我一样, 愿意像这样在实践中学习呢?

上一篇下一篇

猜你喜欢

热点阅读