xstdys 2019-05-28 17:22 采纳率: 0%
浏览 1728
已采纳

python调用函数和列表的问题

为啥列表没有复制上
图片说明

运行结果如下:

图片说明

下面是运行成功的程序和结果图
图片说明
图片说明

  • 写回答

1条回答 默认 最新

  • 战渣渣 2019-05-29 09:32
    关注

    问题根源:
    在内存中magicians这个是一个地址。

    make_great函数中magicians.pop时已经把原地址中magicians变为一个空列表。

    后面再magicians=changed_magicians[:]时,这个magicians和刚开始的时候已经不是一个地址,可以在make_great函数中的开始和结尾使用id(magicians)来进行查看他们的地址,看下面的代码

    def make_great(magicians):
        changed_magicians = []
        print("原始地址 >>> ", id(magicians))
        while magicians:
            current_magician = "the Great " + magicians.pop()
            changed_magicians.append(current_magician)
        magicians = changed_magicians[:]
        print("变更后地址 >>> ", id(magicians))
    

    所以两次show函数使用的是地址1的list,而make函数第一次拿到的变量 magicians指向的是地址1的list,然后你使用了pop方法,
    相当于把地址1这个list变量给清空了。你第二步在函数创建将变量magicians指向你新建的一个list,这个list的地址和地址1的list不是一个。
    所以造成你的问题。

    解决方法是在make函数中不要使用pop,而是使用替换的方式:

    def make_great(magicians):
        changed_magicians = []
        print("原始地址 >>> ", id(magicians))
        for idx, magician in enumerate(magicians) :
            current_magician = "the Great " + magician
            magicians[idx] = current_magician
        print("变更后地址 >>> ", id(magicians))
    

    如果不知道enumerate函数的作用就百度搜一下。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图