我们有时会不经意间写下如下代码:
def update_indices(indices):
indices = [] # 像在更新indices前先将其置空
for i in range(10):
indices.append(i)
indices = [0, 1, 2]
update_indices(indices)
print(indices)
如上所示,我们有一个元素为 indices
的列表,想通过函数 update_indices
对其进行更新。不过有点特殊的是,我们想在 update_indices
中先将列表置空,然后再插入元素 0, 1,..., 9
。不过,代码运行的结果会出乎我们意料:
[0, 1, 2]
诶~并不是我们想象的 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
,而是根本就没有变,变量 indices
还是和调用函数 update_indices
前一样。难道是因为函数参数传的拷贝吗?肯定不会,因为我们知道Python中对于列表统一传的是引用,那是什么导致我们对参数的修改失效了呢?
答案就是函数第一行的
indices = []
这一行看似是将函数参数 indices
置为空,其实是重新定义了一个函数中的局部变量 indices
,这个局部变量 indices
将函数的参数 indices
屏蔽掉了。而我们之后在函数中对 indices
的操作,其实都是在更改函数的局部变量,当然不能影响到做为函数参数的 indices
了。
解决这个问题的途径之一是:对于需要对参数重置的函数,我们最好直接传返回值,避免引起歧义:
def update_indices():
indices = [] # 像在更新indices前先将其置空
for i in range(10):
indices.append(i)
return indices
indices = [0, 1, 2]
indices = update_indices()
print(indices)
这样,结果就如我们预期了:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Original: https://www.cnblogs.com/orion-orion/p/15860632.html
Author: orion-orion
Title: Python:Python中的参数屏蔽
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/805445/
转载文章受原作者版权保护。转载请注明原作者出处!