Python ссылается на петли

1

Я играю for циклов в Python и пытаюсь привыкнуть к тому, как они обрабатывают переменные.

Возьмите следующий код для кода:

a=[1,2,3,4,5]
b=a
b[0]=6

После этого нулевой элемент как b и a должен быть 6. Знак = указывает на ссылку в массиве, да?

Теперь я беру цикл for:

a=[1,2,3,4,5]
for i in a:
    i=6

Мое ожидание будет то, что каждый элемент теперь a 6, потому что я предположил бы, что i указывает на элементы в, а не копировать их; a однако, похоже, это не так.

Уточнение будет оценено, спасибо!

Теги:

3 ответа

5
Лучший ответ

Все в python рассматривается как ссылка. Что происходит, когда вы делаете b[0] = 6, вы назначаете 6 в соответствующее место, определенное LHS этого выражения.

Во втором примере вы назначаете ссылки из массива на i, так что i равно 1, затем 2, затем 3,... но i никогда не являюсь элементом массива. Поэтому, когда вы назначаете ему 6, вы просто меняете вещь, которую i представляю.

http://docs.python.org/reference/datamodel.html является интересным, если вы хотите узнать больше о деталях.

5

Это не так, как это работает. Цикл for выполняет итерацию через значения a. Переменная я на самом деле не имеет смысла того, что есть в себе. В основном, что происходит:

# this is basically what the loop is doing:
# beginning of loop:
i = a[0]
i = 6
# next iteration of for loop:
i = a[1]
i = 6
# next iteration of for loop:
i = a[2]
i = 6
# you get the idea.

Ни при каких обстоятельствах значение при индексе не меняется, единственное, что нужно изменить, это значение i.

Вы пытаетесь это сделать:

for i in xrange(len(a)):
    a[i] = 6 # assign the value at index i
  • 1
    «Переменная не я на самом деле имеет никакого смысла того , что в себе» - это не совсем верно, i это ссылка на значения в но назначение изменится a i быть ссылка на что - то другое, и целые неизменны так нет никакого способа изменить список OP, изменяя i в цикле for . Но рассмотрим a = [[1], [2]] тогда for i in a: i[:] = [6] . a станет [[6], [6]] .
  • 0
    @FJ Это потому, что значения a являются изменяемыми типами сами по себе. Он не имеет ничего общего с положением в a, скорее он имеет отношение к объектам, независимо от того, находятся они в или нет.
Показать ещё 1 комментарий
0

Как вы сказали, "Знак = указывает на ссылку". Таким образом, ваша петля просто переназначает ссылку "i" на 5 разных номеров, каждая по очереди.

  • 0
    Я прочитал ваш ответ и ударил себя. Это было так просто! Есть ли способ заставить цикл for вести себя так, как я хочу? (Однозначный Upvote - вы бьете по сути дела.)
Сообщество Overcoder
Наверх
Меню