美文网首页python 入门
Python入门教程: 变量与数组的赋值

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

作者: 破旧的大卡车 | 来源:发表于2017-11-07 10:33 被阅读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的值如何改变?

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

    相关文章

      网友评论

        本文标题:Python入门教程: 变量与数组的赋值

        本文链接:https://www.haomeiwen.com/subject/kzpdmxtx.html