首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python速成课程Q8-10

Python速成课程Q8-10
EN

Stack Overflow用户
提问于 2017-01-22 23:56:41
回答 2查看 241关注 0票数 0

8-9。魔术师:列出魔术师的名字。将列表传递给一个名为show_magicians()的函数,该函数打印列表中每个魔术师的名字。

8-10。伟大的魔术师:从练习8-9的程序副本开始。编写一个名为make_great()的函数,通过将短语"the Great"添加到每个魔术师的名字来修改魔术师列表。调用show_magicians()查看该列表是否已被实际修改。

对于8-10:我知道这是可行的:

代码语言:javascript
运行
复制
def make_great(list_of_magicians):
    index = 0
    while index < len(list_of_magicians):
        for magician in list_of_magicians:
            list_of_magicians[index] = "The Great " + magician
            print(list_of_magicians) # Seeing change in list each time.
            index += 1 

**Q:为什么不起作用?**

代码语言:javascript
运行
复制
def make_great(list_of_magicians):
    for magician in list_of_magicians:
        magician = 'The great ' + magician
EN

回答 2

Stack Overflow用户

发布于 2017-01-23 00:01:31

这一行:

代码语言:javascript
运行
复制
magician = 'The great ' + magician

仅修改变量magician。这对列表中的值没有影响。

在正常工作的代码中,对应的代码行是:

代码语言:javascript
运行
复制
list_of_magicians[index] = "The Great " + magician

这会更改列表的实际内容,因此它可以正常工作。

票数 2
EN

Stack Overflow用户

发布于 2017-01-23 00:49:58

在……里面

代码语言:javascript
运行
复制
for magician in list_of_magicians:
    magician = 'The great ' + magician

第一行遍历list_of_magicians中的字符串,将每个字符串依次绑定到名称magician。它不会创建字符串的副本。但是,下一行通过连接'The great 'magician字符串来创建一个新字符串,然后=将该新字符串绑定到名称magician,在该操作之后,该名称不再引用列表项。

如果我们可以做str_prepend('The great ', magician),那么你的技术就可以工作了,但是我们不能这样做,因为Python字符串是不可变的。但这里有一个使用列表列表的相关示例。因为列表是可变的,所以我们可以通过修改u来更改a中的列表

代码语言:javascript
运行
复制
a=[['a'], ['b'], ['c']]
for u in a:
    u.append('z')
print(a)

输出

代码语言:javascript
运行
复制
[['a', 'z'], ['b', 'z'], ['c', 'z']]

以下是编写make_great函数的一种方法。在Python中,通常首选直接迭代容器中的项,而不是通过索引间接迭代。编写make_great函数的一个简单方法是这样做:

代码语言:javascript
运行
复制
def make_great(list_of_magicians):
    new_list = []
    for magician in list_of_magicians:
        new_list.append('The great ' + magician)
    return new_list

magician_names = ['Alice', 'Alex', 'Blake']
magician_names = make_great(magician_names)
print(magician_names)

输出

代码语言:javascript
运行
复制
['The great Alice', 'The great Alex', 'The great Blake']

这将用新的列表替换原始的magician_names列表。如果我们想要修改原始列表对象,我们可以使用slice赋值:

代码语言:javascript
运行
复制
magician_names[:] = make_great(magician_names)

或者,我们可以在make_great内部进行切片赋值,改变传入的列表。对于Python函数来说,改变其参数以返回None是一种惯例。

代码语言:javascript
运行
复制
def make_great(list_of_magicians):
    new_list = []
    for magician in list_of_magicians:
        new_list.append('The great ' + magician)
    list_of_magicians[:] = new_list

magician_names = ['Alice', 'Alex', 'Blake']
make_great(magician_names)
print(magician_names)

或者,我们可以使用列表理解来做几乎相同的事情,它更紧凑(也更快),并且不需要new_list名称:

代码语言:javascript
运行
复制
def make_great(list_of_magicians):
    list_of_magicians[:] = [
        'The great ' + magician for magician in list_of_magicians
    ]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41793026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档