伙计们,

下面代码的结果是[]
为什么不是 ['0','1','2']?如果我想让函数 foo 中的 psswd 等于 number,我该怎么做?

number = ['0','1','2']
def foo(psswd):
    psswd = number[:]

if __name__ == '__main__':
    psswd = []
    foo(psswd)
    print psswd

最佳答案

您的代码:

number = ['0','1','2']
def foo(psswd):
    psswd = number[:]

if __name__ == '__main__':
    psswd = []
    foo(psswd)
    print psswd
psswd = number[:] 使用新列表重新绑定(bind)局部变量 psswd

即,当您执行 foo(psswd) 时,函数 foo 被调用,并在其中创建了指向同名全局列表的局部变量 passwd

当您在 psswd = <something> 函数中执行 foo 时,会创建/获取此 <something> 并且使本地名称 psswd 指向它。全局变量 psswd 仍然指向旧值。

如果要更改对象本身,而不是本地名称,则必须使用此对象的方法。 psswd[:] = <smething> 实际上调用了 psswd.__setitem__ 方法,从而修改了本地名称 psswd 所引用的对象。

关于python传递列表作为函数参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9765843/

10-09 18:44