список пропусков Python как параметр функции - PullRequest
3 голосов
/ 19 марта 2012

люди

Результатом следующего кода является [] Почему это не ['0', '1', '2']? Если я хочу сделать psswd равным числу в функции foo, что мне делать?

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

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

Ответы [ 3 ]

12 голосов
/ 19 марта 2012

Вам нужно мутировать вместо повторного связывания, с назначением слайса .

psswd[:] = number[:]
6 голосов
/ 19 марта 2012
number = ['0','1','2']
def foo(psswd):
    psswd[:] = number  # swap the slice around here

if __name__ == '__main__':
    psswd = []
    foo(psswd)
    print psswd
1 голос
/ 19 марта 2012

Ваш код:

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, изменяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...