```python
#first way
def make_great(magicians):
magicians = ['The Great '+ i for i in magicians]
#second way
def make_great2(magicians):
for i in range(len(magicians)):
magicians[i] = 'The great '+ magicians[i]
```
原参数只通过第二种方式改变。
在python中,变量名用于引用对象(例如您的示例中的列表)。在第一种方法中,您创建了一个新的列表对象(使用原始列表中的一些数据),并设置变量"魔术师"。指的是这个新对象。但是函数结束后,这个对象就不再使用了。你可以通过返回魔术师来让这个方法工作,然后调用它:Great_magicians = make_great(names)
相反,第二种方法不是创建一个新的列表对象。相反,它会去到原始列表中的每个位置,并用新字符串替换每个字符串。因此,当您完成后,原始列表已被修改。
第一个不改变传递的列表,而只是重新绑定局部变量magicians
。您可以使用切片赋值使它成为一个突变:
def make_great(magicians):
magicians[:] = ['The Great ' + i for i in magicians]
第一种方法从第一种方法创建一个新列表,但不返回列表,因此新的magicians
列表不会超出函数,并且在调用函数的作用域内,magicians
仍然是原始列表。
第二种方法改变列表。