Ваш код:
number = ['0','1','2']
def foo(psswd):
psswd = number[:]
if __name__ == '__main__':
psswd = []
foo(psswd)
print psswd
psswd = number[:]
связывает локальную переменную psswd
с новым списком.
Т.е., когда вы делаете foo(psswd)
, вызывается функция foo
, и внутри нее создается локальная переменная passwd
, которая указывает на глобальный список с тем же именем.
Когда вы выполняете psswd = <something>
внутри функции foo
, создается / получается это <something>
и создается локальное имя psswd
, указывающее на него. Глобальная переменная psswd
по-прежнему указывает на старое значение.
Если вы хотите изменить сам объект, а не локальное имя, вы должны использовать методы этого объекта. psswd[:] = <smething>
фактически вызывает метод psswd.__setitem__
, таким образом, объект, на который ссылается локальное имя psswd
, изменяется.