python中对象及对象引用--傻傻分不清

声明: 

本文是对公众号文章的一点理解:

公众号文章: https://mp.weixin.qq.com/s/OQFGEtC_K-xU_ttZA4ssNg

代码: 

def main():
    names = ['Ada','Lisa','Tom','Luna','Monica']
    subjs = ['Chinese','Math','English']
    scores = [[0] * 3] * 5    # 创建一个3列5行的列表
    print(scores)
    for row,name in enumerate(names):
        print('please input %s\'s scores'%(name))
        for col,subj in enumerate(subjs):
            scores[row][col] = float(input(subj + ':'))
    print(scores)

if __name__ == '__main__':
    main()

结果以及问题

对公众号文章的理解及句子:、

(1)      程序中可以使用的内存从逻辑上可以为五个部分,按照地址从高到低依次是:栈(stack)、堆(heap)、数据段(data segment)、只读数据段(static area)和代码段(code segment)

(2)    栈用来存储局部、临时变量,以及函数调用时保存现场和恢复现场需要用到的数据,这部分内存在代码块开始执行时自动分配,代码块执行结束时自动释放,通常由编译器自动管理。

(3)   堆的大小不固定,可以动态的分配和回收,因此如果程序中有大量的数据需要处理,这些数据通常都放在堆上,如果堆空间没有正确的被释放会引发内存泄露的问题,而像Python、Java等编程语言都使用了垃圾回收机制来实现自动化的内存管理(自动回收不再使用的堆空间)

-------

原代码中的:[[0]*3] *5 只是对[0]列表对象的地址进行了*3,使得创建的5*3的矩阵,每一列的存储对象的地址都是一样的。

错误原因:

                  每一行数据的存储地址是一样的

纠错后代码:

def main():
    names = ['Ada','Lisa','Tom','Luna','Monica']
    subjs = ['Chinese','Math','English']
    scores = [[0] * 3 for i in range(5)]  # 列表推导式
    print(scores)
    for row,name in enumerate(names):
        print('please input %s\'s scores'%(name))
        for col,subj in enumerate(subjs):
            scores[row][col] = float(input(subj + ':'))
    print(scores)

if __name__ == '__main__':
    main()

结果:

总结:

(1)  使用嵌套列表或是复制对象的时候,操作的是对象的存储地址,而不是对象的数值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值