标题中已经提到,我利用python的for循环的时候如果直接进行赋值,list里的值并不会改变,例如下面代码段1就是经典错误示范:
代码段1(错误示范):做一个给列表的值(字符串格式)添加"The Great "前缀的函数
def make_great(ass):
b=[] #空列表方便把改后的临时变量append进去·
for a in ass:
a="The Great" + a
b.append(a)
ass=b #错误方法,实际的ass存储的仍然是执行这个函数前的内容,因为函数结束后这个赋值就会被系统缓存释放掉
magicers=["liuQian","Dr.D","Kasonbalonga"]
make_great(magicers)
print(magicers)
看起来好像天衣无缝,应该可以得到正确结果,但是在定义函数时最后一句ass=b并不会把b列表内容直接写入实际参数的存储中,因为这一次赋值也跟循环中的赋值类似只是一次临时调用,函数执行结束后,缓存一释放ass还是之前的ass,并不会改变原本已有的物理块存储中的文件系统内容
那再说一下怎么能在for循环中真的改变列表的值吧,我提供两种方法:
方法一:利用return把想要的新列表传出来赋值给其他变量
此方法只需要改掉错误代码段1中,定义函数的最后一句,即:
把ass=b改为return b
这样后续调用的时候,可以这样调用
magicers=["liuQian","Dr.D","Kasonbalonga"]
b=make_great(magicers[:])
print(magicers)
print(b)
得到的结果是:
方法二:利用index索引方法改掉列表值
def make_great(ass):
n=len(ass)
for i in range(n):
ass[i]="The Great "+ ass[i]
magicers=["liuQian","Dr.D","Kasonbalonga"]
b=magicers[:]
make_great(b)
print(b)
得到结果是:
利用索引可以直接指向列表的物理地址,修改物理地址对应的文件系统内容
总结:两种方法都可以,都是还不错的方法,但是用index索引方法高效一点点,不过也就一点点,具体看个人习惯