【发布时间】:2012-04-03 16:23:27
【问题描述】:
各位,
下面代码的结果是[] 为什么不是 ['0','1','2']?如果我想让函数foo中的psswd等于数字,我该怎么办?
number = ['0','1','2']
def foo(psswd):
psswd = number[:]
if __name__ == '__main__':
psswd = []
foo(psswd)
print psswd
【问题讨论】:
各位,
下面代码的结果是[] 为什么不是 ['0','1','2']?如果我想让函数foo中的psswd等于数字,我该怎么办?
number = ['0','1','2']
def foo(psswd):
psswd = number[:]
if __name__ == '__main__':
psswd = []
foo(psswd)
print psswd
【问题讨论】:
您需要使用slice-assigning 进行变异而不是重新绑定。
psswd[:] = number[:]
【讨论】:
number = ['0','1','2']
def foo(psswd):
psswd[:] = number # swap the slice around here
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[:] 用新列表重新绑定局部变量 psswd。
即,当您执行foo(psswd) 时,会调用函数foo,并在其中创建局部变量passwd,该变量指向同名的全局列表。
当您在foo 函数中执行psswd = <something> 时,会创建/获取此<something> 并让本地名称psswd 指向它。全局变量psswd 仍然指向旧值。
如果你想改变对象本身,而不是本地名称,你必须使用这个对象的方法。 psswd[:] = <smething>实际上调用了psswd.__setitem__方法,从而修改了本地名称psswd引用的对象。
【讨论】: