Потому что это локальная переменная. Вот почему ему ничего не назначено:
Локальные переменные несколько отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Если вы не можете инициализировать свою локальную переменную там, где она объявлена, не забудьте присвоить ей значение, прежде чем пытаться его использовать. Доступ к неинициализированной локальной переменной приведет к ошибке времени компиляции.
blockquote>Изменить: почему Java вызывает эту ошибку компиляции? Если мы посмотрим на файл класса
IdentifierExpression.java
, мы найдем этот блок:... if (field.isLocal()) { LocalMember local = (LocalMember)field; if (local.scopeNumber < ctx.frameNumber && !local.isFinal()) { env.error(where, "invalid.uplevel", id); } if (!vset.testVar(local.number)) { env.error(where, "var.not.initialized", id); vset.addVar(local.number); } local.readcount++; } ...
Как указано (
if (!vset.testVar(local.number)) {
), JDK проверяет (сtestVar
), если переменная назначена (исходный кодVset
, где мы можем найти кодtestVar
). Если нет, он вызывает ошибкуvar.not.initialized
из файла свойств :... javac.err.var.not.initialized=\ Variable {0} may not have been initialized. ...
Общая структура таких задач: df.loc [cond, col] = ...
Использование настройки @ meW,
df = pd.DataFrame({'col': ['Elephant', 'Grass', 'Parameter', 'Root']})
df.loc[df.col.eq('Parameter'), 'col'] = df.col.shift(1)
col
0 Elephant
1 Grass
2 Grass
3 Root