понимание циклов со ссылкой на список контейнеров в Python - PullRequest
5 голосов
/ 07 мая 2011

Мой вопрос касается следующего для цикла:

x=[[1,2,3],[4,5,6]]
for v in x:
  v=[0,0,0]

здесь, если вы напечатаете x, вы получите [[1,2,3], [4,5,6]] .. так что vизменено на самом деле не ссылка на список в х.Но когда вы делаете что-то вроде следующего:

x=[[1,2,3],[4,5,6]]
for v in x:
  v[0]=0; v[1]=0; v[2] =0

, тогда вы получаете x как [[0,0,0], [0,0,0]].Это довольно сложно, если список внутри x довольно длинный и даже делает что-то вроде этого:

x=[[1,2,3],[4,5,6]]
for v in x:
  for i in v:
    i = 0

даст мне x как [[1,2,3], [4,5,6]].Лучше всего использовать для i в xrange (0,3): v [i] = 0 .. Хотя я все еще хотел бы знать, что здесь происходит и каковы другие альтернативы, когдаиметь список списков или больше вложенных списков.

Ответы [ 2 ]

7 голосов
/ 07 мая 2011

Когда Python выполняет v = [0, 0, 0], это

  1. Создание нового объекта списка с тремя нулями в нем.
  2. Назначение ссылки на новый список для метки с именем v

Неважно, была ли v ссылка на что-то еще раньше.

Если вы хотите изменить содержимое списка, на который в данный момент ссылается v, то вы не можете использовать синтаксис v =. Вы должны присвоить ему элементы, как вы упомянули, или использовать обозначение среза v[:] =, как отмечено Свеном.

6 голосов
/ 07 мая 2011
x = [[1,2,3],[4,5,6]]
for v in x:
    v[:] = [0,0,0]

должен добиться цели.

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