首页 > 其他分享 >了不起的魔术师问题

了不起的魔术师问题

时间:2023-07-14 18:13:21浏览次数:42  
标签:Great magicians show 了不起 list 问题 魔术师 print magician

目录

了不起的魔术师问题

前言

此问题来自于 <<Python 编程: 从入门到实践>>第一版中习题 8-10.

问题描述

了不起的魔术师: 创建一个包含魔术师名字的列表, 并将其传递给一个名为 show_magicians()的函数,这个函数打印列表中每个魔术师的名字.再编写一个名为 make_great()的函数,对魔术师列表进行修改,在每个魔术师的名字中都加入字样"the Great",调用函数 show_magicians(),确认魔术师列表确实改变了.

解决方案

起初我的想法非常简单,就是通过将魔术师的名单传递给make_great()函数,然后在函数内对列表元素进行遍历,并在每个元素前加上'the Great'字符串,代码如下:

def make_great(magicians):
    for magician in magicians:
        magician = "the Great " + magician


def show_magicians(magicians):
    make_great(magicians)
    for magician in magicians:
        print(magician.title())


magicians_name = ['john', 'kitty', 'peter']
show_magicians(magicians_name)

输出结果为:

John
Kitty
Peter

说明实际上列表元素并没有被修改,而且在 IDE 中还会有这样一条 warning:

Local variable 'magician' value is not used:3

能够很明显地看出在第三行,左值的 migician 变量和右值的 migician 变量实际上是两个变量,右值为 for 循环中列表内的元素,而左值是一个本地变量,打印其地址,代码如下:

def make_great(magicians):
    for magician in magicians:
        print(str(id(magician)) + " for magician")
        magician = "the Great " + magician
        print(str(id(magician)) + " local magician\n")


def show_magicians(magicians):
    print(str(id(magicians)) + " list address\n")
    print(str(id(magicians[0])) + " 0 address")
    print(str(id(magicians[1])) + " 1 address")
    print(str(id(magicians[2])) + " 2 address\n")
    make_great(magicians)
    for magician in magicians:
        print(str(id(magician)) + " show magician\n")
        print(magician.title())


magicians_name = ['john', 'kitty', 'peter']
show_magicians(magicians_name)

输出结果为:

4354652288 list address

4355416432 0 address
4355416112 1 address
4355416176 2 address

4355416432 for magician
4355416752 local magician

4355416112 for magician
4355416752 local magician

4355416176 for magician
4355416752 local magician

4355416432 show magician

John
4355416112 show magician

Kitty
4355416176 show magician

Peter

Process finished with exit code 0

从这个输出结果可以看出以下几点:

  • Python 中列表名并不代表首地址,它是一个指针,指向列表的首地址
  • 列表作为实参传递给函数时是地址传递而非值传递
  • 用 for 循环来遍历列表时无法对列表元素的值做出修改,即使变量名相同,作为左值的变量始终是一个 local variable 且是一个标量.且此规则再 main 和其它函数中都是一样的.说明应该是 for 的特性导致的,而非传参的问题.

目前还暂时没有想出为什么用这种方式无法修改列表中元素的值.因此只能尝试用相对比较繁琐的下标索引的方式来进行修改,代码如下:

def make_great(magicians):
    num = 0
    while num < len(magicians):
        magicians[num] = 'the Great ' + magicians[num]
        num += 1


def show_magicians(magicians):
    make_great(magicians)
    for magician in magicians:
        print(magician.title())


magicians_name = ['john', 'kitty', 'peter']
show_magicians(magicians_name)

输出结果为:

The Great John
The Great Kitty
The Great Peter

说明用索引的方式是可以修改列表中特定元素的值的.

另外还在网上看到了一种解决方法,用函数enumerate获取索引来解决,本质上和上一段代码是一样的,具体代码如下:

def show_magicians(magician_list):
    for magician in magician_list:
        print(magician.title())


def make_great(magician_list):
    for index, magician in enumerate(magician_list):
        magician_list[index] = "the Great " + magician


def main():
    magician_list = ['jack', 'peter', 'kitty']

    if not magician_list:
        print("magician_list is None")
        return

    print("magician:\n")
    show_magicians(magician_list)
    print("---")
    print("the Great magician:\n")
    make_great(magician_list)
    show_magicians(magician_list)


if __name__ == "__main__":
    main()

输出结果为:

magician:

Jack
Peter
Kitty
---
the Great magician:

The Great Jack
The Great Peter
The Great Kitty

参考

https://blog.csdn.net/u013272574/article/details/84319661

https://www.zhihu.com/question/61218362

标签:Great,magicians,show,了不起,list,问题,魔术师,print,magician
From: https://www.cnblogs.com/yukina/p/17554679.html

相关文章

  • Qt信号槽信号函数重载问题 error: C2664: “QMetaObject::Connection const”
    //connect(spinFontSize,&QSpinBox::valueChanged,this,&MainWindow::spinFontSize_valueChanged);//由于信号函数存在重载,发送者找不到正确信号函数。//改用A.Qt4带形参方式//connect(spinFontSize,SIGNAL(valueChanged(int)),this,SLOT(spinFontSize_valueChang......
  • vue进行页面跳转样式丢失问题
    问题:vue使用 this.$router.push方法进行页面跳转时样式丢失,如下图,图一为正常页面,图二为跳转后的界面  解决方法:并非样式丢失,而是样式背覆盖了,去跳转的原界面样式中加入scope,跳转之后问题解决 ......
  • 自定义图标偏移问题
    在地图开发中使用自定义图标(icon)在地图上表达专题信息十分常见leaflet中常使用L.marker添加图标L.icon,非常方便给定坐标将图标固定在地图中的某个位置,由于图标是有具体大小,并且大小固定不变,在缩放过程中有明显感觉随着地图比例尺缩小,图标会有一定的偏移这篇文章主要介绍使用L......
  • ABA问题
    ABA问题是并发编程中的一个经典问题,主要涉及多线程和共享变量的操作。在多线程环境中,如果多个线程对同一个共享变量进行读取和修改操作,可能会导致ABA问题。ABA问题指的是以下情况:线程A读取共享变量的值为A。线程A被调度出去,线程B进入执行,并将共享变量的值修改为B。线程B被调......
  • 关于.properties文件使用中文出现乱码问题,及在eclipse和idea中如何查看
    最近修改一个老java项目(使用jdk1.6),发现在eclipse中打开.properties文件,有中文字符的都变成了类似 \u901a\这样的字符,查看文件编码已经是UTF-8,即使用idea打开也是如此,而且idea文件编码是灰色,无法修改;搜索了一番,终于找到了相应的查看方法,其实就是编辑器给你再转回汉字......
  • MySQL中,存储小数类型的FLOAT、DOUBLE和DECIMAL常见面试问题
    面试考察范围在MySQL中,关于FLOAT、DOUBLE和DECIMAL类型的面试题常涉及以下几个方面:数据存储方式:问答关于这些类型数据在内存中的存储方式和字节大小的问题,如FLOAT占用多少字节,DOUBLE占用多少字节等。精度和范围:询问不同类型对数字精度和范围的影响,比如FLOAT能存储的有效位......
  • python之数据库:SQL注入问题,视图,触发器,事务,存储过程,函数,流程控制,索引,慢查询
    SQL注入问题(了解现象)importpymysql#连接MySQL服务端conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='db8_3',charset='utf8',autocommit=True#......
  • VMware17无法连接USB设备的问题解决方案
    前言【前言都是废话,可以直接看解决方案】事情是这样的,最近在做IMX6ULL的开发,刚开始就遇到了这个拦路虎问题,我使用的闪迪的TF卡32GB的,搭配绿联的读卡器使用。在windows以及物理机装的archlinux都能正常识别并进行挂载,离谱的就是在虚拟机上识别不了。虚拟机版本:VMwareWorkstati......
  • 如何完美解决前端数字计算精度丢失与数字格式化问题?
    大家好,我是木瓜太香,做前端开发经常会遇到数字计算精度丢失的问题,和数字格式化的麻烦问题,好不容易找到了可以解决这些问题的库结果用起来不够方便,例如bignumber.jsdecimal.js等编写体验不好,这篇文章来帮助你完美解决这些问题接下来我们根据以下两个问题展开说说:只有前端会......
  • 【AGC】云数据库开发常见问题汇总
    ​ 【问题背景】近期越来越多的开发者通过SDK使用云数据库,云数据库是一款支持端云数据协同管理、可扩展的Serverless数据库产品,提供简单易用的多平台原生SDK,您的应用可以通过SDK直接访问云侧数据库。同时,云数据库还支持通过ServerSDK直接管理云侧数据,实现云侧数据的高效管理。......