Давайте перепишем ваш код следующим образом:
x = 1
y = [x]
z = y * 4
myList = [z] * 3
После этого запустите следующий код, чтобы сделать все более понятным. Что делает код, в основном печатает id
s полученных объектов, которые
Вернуть «идентификатор» объекта
и поможет нам идентифицировать их и проанализировать, что происходит:
print("myList:") for i, subList in enumerate(myList): print("\t[{}]: {}".format(i, id(subList))) for j, elem in enumerate(subList): print("\t\t[{}]: {}".format(j, id(elem)))
И вы получите следующий результат:
x: 1 y: [1] z: [1, 1, 1, 1] myList: [0]: 4300763792 [0]: 4298171528 [1]: 4298171528 [2]: 4298171528 [3]: 4298171528 [1]: 4300763792 [0]: 4298171528 [1]: 4298171528 [2]: 4298171528 [3]: 4298171528 [2]: 4300763792 [0]: 4298171528 [1]: 4298171528 [2]: 4298171528 [3]: 4298171528
Итак, теперь давайте шаг за шагом. У вас есть
x
, который является1
, и единственным списком элементовy
, содержащимx
. Ваш первый шаг -y * 4
, который даст вам новый списокz
, который в основном[x, x, x, x]
, т. Е. Создает новый список, который будет содержать 4 элемента, которые являются ссылками на исходный объектx
. Чистый шаг очень похож. В основном вы делаетеz * 3
, который является[[x, x, x, x]] * 3
и возвращает[[x, x, x, x], [x, x, x, x], [x, x, x, x]]
по той же причине, что и для первого шага.
Группа, определенная (..)
, является группой 1. Конец квантора +
повторяет его. Каждый раз, когда движок может повторять группу (совпадающие с двумя символами), группа 1 перезаписывается.
aa
в группу 1 bb
до группы 1 cc
в группу 1. Когда вы проверяете группу 1, двигатель возвращает cc
. Все остальные записи потеряны.
(Исключением является механизм .NET, который также возвращает cc
, а также позволяет проверять промежуточные захваты благодаря объекту CaptureCollection. Он будет содержать aa
, bb
и cc
.)
С помощью (..)+(...)
, почему группа 1 содержит aa
? Откат!
Чтобы понять это, нам снова нужно следовать по пути движка регулярного выражения.
aa
в группу 1 (..)
и фиксирует bb
в группе 1 (..)
и захватывает cc
в группу 1 (...)
. Он терпит неудачу: нет никаких символов, оставшихся для потребления. +
означает один или несколько раз, и мы сопоставили ..
три раза, поэтому мы можем дать один или даже два. На этом этапе двигатель отказывается от последнего совпадения количественной группы (..)+
, которая является cc
. Мы вернулись, когда группа 1 была bb
. (...)
. Осталось всего два символа: cc
, поэтому он снова не работает. (..)+
, которая является bb
. На этом этапе группа 1 снова aa
. (...)
. Успешно: группа 2 - bbc
, а группа 1 - aa
Ссылка
(..)+(...)
. Также настоятельно рекомендуем прочитать «Сведения о горах». статья связана. :) – zx81 21 July 2014 в 03:52