Назначение Python для циклов (уточнение теории) - PullRequest
0 голосов
/ 30 июня 2018

Мне нужно уточнить, что здесь происходит, и какова реальная причина этого:

array = [0, 1, 2]
for element in array:
    element += 1

print array #CHANGES NOTHING

double_array = [[0,1], [2,3]]
for element in double_array:
    element[0] = "Changed!"

print double_array #THIS WORKS

for element in double_array:
    element = ["Doesn't work!"]

print double_array #NOPE

Я понимаю это интуитивно, но я не уверен в теории, стоящей за этим. Мне кажется, что имя переменной в python - это неземная вещь, которая сразу же развалится, если вы поставите «=» сразу после нее. Если переменная ссылается на список, вы можете использовать «.append» после него или «[0] =» после него, и он действует как ссылка в C, но если вы назначаете ему что-то напрямую, python сразу , «о, тебе больше не нужно это имя? Хорошо, теперь оно относится только к той вещи, которую ты ему назначил, и ничего больше».

В частности, мне кажется неправильным говорить о моем первом случае, что «целые числа неизменны». В моем третьем случае список выглядит таким же неизменным, как и целое число. Каково правильное объяснение этого?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

В первом случае pyhton создает новую переменную для каждого значения в списке и не применяет старую ссылку на переменную. Но во втором случае Python создает новую переменную для списка в целом, но не для каждой переменной. Таким образом, ссылки на элементы в списке остаются неизменными и изменяют этот конкретный элемент. В третьем случае он создает переменную, подобную второму, и изменяет переменную целиком, но не значение каждого элемента.

0 голосов
/ 30 июня 2018

В Python каждая переменная, элемент массива и атрибут являются ссылкой, и единственное, что =, +=, -= и т. Д. Могут сделать, это изменить то, к чему относится их левая часть , Обратите внимание, что любая другая операция будет действовать непосредственно на значение, на которое ссылается, например, . (поиск атрибута объекта, на который ссылается левая сторона) или [] (поиск элемента списка / dict, на который ссылается левая сторона).

Если вы пытаетесь понять Python с точки зрения C, имейте это в виду:

  • В Python нет такого понятия, как примитивный тип данных или переменная примитивного типа
  • Назначение всегда влияет на то, на что ссылается переменная, так же, как на указатель в C
  • Любые другие операции используют и / или влияют на указанное значение, поэтому вы можете рассматривать его как автоматическую разыменование. В частности, a.b соответствует a->b или (*a).b.
...