8-9。魔术师:列出魔术师的名字。将列表传递给一个名为show_magicians()
的函数,该函数打印列表中每个魔术师的名字。
8-10。伟大的魔术师:从练习8-9的程序副本开始。编写一个名为make_great()
的函数,通过将短语"the Great"
添加到每个魔术师的名字来修改魔术师列表。调用show_magicians()
查看该列表是否已被实际修改。
对于8-10:我知道这是可行的:
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:为什么不起作用?**
def make_great(list_of_magicians):
for magician in list_of_magicians:
magician = 'The great ' + magician
发布于 2017-01-23 00:01:31
这一行:
magician = 'The great ' + magician
仅修改变量magician
。这对列表中的值没有影响。
在正常工作的代码中,对应的代码行是:
list_of_magicians[index] = "The Great " + magician
这会更改列表的实际内容,因此它可以正常工作。
发布于 2017-01-23 00:49:58
在……里面
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
中的列表
a=[['a'], ['b'], ['c']]
for u in a:
u.append('z')
print(a)
输出
[['a', 'z'], ['b', 'z'], ['c', 'z']]
以下是编写make_great
函数的一种方法。在Python中,通常首选直接迭代容器中的项,而不是通过索引间接迭代。编写make_great
函数的一个简单方法是这样做:
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)
输出
['The great Alice', 'The great Alex', 'The great Blake']
这将用新的列表替换原始的magician_names
列表。如果我们想要修改原始列表对象,我们可以使用slice赋值:
magician_names[:] = make_great(magician_names)
或者,我们可以在make_great
内部进行切片赋值,改变传入的列表。对于Python函数来说,改变其参数以返回None
是一种惯例。
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
名称:
def make_great(list_of_magicians):
list_of_magicians[:] = [
'The great ' + magician for magician in list_of_magicians
]
https://stackoverflow.com/questions/41793026
复制相似问题