Есть две проблемы, во-первых, вы не начинаете итерацию там, где вы думаете:
i = 1 # great, i is 1
for i in range(5):
print(i)
0
1
2
3
4
i
было перезаписано значением, отслеживающим цикл.
Во-вторых, is
не означает эквивалентность значений. Это зарезервировано для оператора ==
. Более простые типы, такие как int
и str
, могут показаться, что is
работает таким образом, но другие типы не ведут себя так:
a, b = 5, 5
a is b
True
a, b = "5", "5"
a is b
True
a==b
True
### This doesn't work
a, b = [], []
a is b
False
a == b
True
Как отметил @Kevin в комментариях, в 99% случаев is
не тот оператор, который вам нужен.
Что касается вашего кода, str.replace
заменит все экземпляры аргумента, предоставленные во втором аргументе, если вы не укажете ему необязательное количество экземпляров для замены. Чтобы избежать замены первого символа, возьмите первый символ отдельно, например, val = somestring[0]
, затем замените остальные, используя фрагмент, нет необходимости в итерации:
somestr = 'restart' # don't use str as a variable name
val = somestr[0] # val is 'r'
# somestr[1:] gives 'estart'
x = somestr[1:].replace(val, '$')
print(val+x)
# resta$t
Если вы все еще хотите выполнить итерацию, вы можете сделать это и над срезом:
# collect your letters into a list
letters = []
char = somestr[0]
for letter in somestr[1:]: # No need to track an index here
if letter == char: # don't use is, use == for value comparison
letter = '$' # change letter to a different value if it is equal to char
letters.append(letter)
# Then use join to concatenate back to a string
print(char + ''.join(letters))
# resta$t