Он не генерирует бесконечное число l oop (это может быть: мы добавляем новый символ в каждой итерации!).
Это потому, что строки в Python неизменны. Когда вы делаете for c in s
, for
l oop, перебираете исходный объект (объект, содержащий "hello"
) и когда вы делаете s += c
, создается новая строка и, следовательно, вы не изменяете исходный строковый объект что for
l oop все еще повторяется.
Кроме того, добавив комментарий @Steven Rumbalski в мой ответ:
Он перебирает исходный объект. Привязка имени к новому объекту не меняет for-l oop, поскольку не разрешает имя на каждой итерации.
Теперь давайте поговорим о вашем втором примере:
Если вы вызываете вашу функцию f(s)
, она делает ее формальным аргументом x
, указывающим на объект, содержащий строку «hello», и создает генератор, используя строковый объект. Теперь последующее переназначение строки s
(с использованием s += c
) фактически создает другую строку и не влияет на исходный объект. Формальный аргумент вашей функции по-прежнему указывает на объект, содержащий "hello"
.
Итак, после первой итерации вашего для l oop во втором примере:
Формальный аргумент функции f(x)
будет по-прежнему указывать на объект, содержащий «hello».
s будет указывать на объект, содержащий "helloh"
.
ВАЖНО:
Однако, если вы попробуете свой код с изменяемыми типами данных, он может создать бесконечное l oop. Смотрите это:
li = [ 1, 2, 3, 4 ]
for i in li:
li.append(i)
print(li)