Ни ast.literal_eval
, ни ast.parse
не предоставляют возможность устанавливать флаги компилятора. Вы можете передать соответствующие флаги в compile
, чтобы проанализировать строку с активированным unicode_literals
, а затем запустить ast.literal_eval
на полученном узле:
import ast
# Not a future statement. This imports the __future__ module, and has no special
# effects beyond that.
import __future__
unparsed = '"blah"'
parsed = compile(unparsed,
'<string>',
'eval',
ast.PyCF_ONLY_AST | __future__.unicode_literals.compiler_flag)
value = ast.literal_eval(parsed)
Да рассчитывают, будет оценен на каждой передаче. Причина, почему то, что для набора возможно быть измененным во время выполнения цикла. Учитывая циклическую структуру переменная я должен представить допустимый индекс в набор во время повторения. Если проверка не была сделана на каждом цикле тогда, это не доказуемо верно. Случай в качестве примера
for ( int i = 0; i < collection.Count; i++ ) {
collection.Clear();
}
одним исключением к этому правилу является цикличное выполнение по массиву, где ограничением является Длина.
for ( int i = 0; i < someArray.Length; i++ ) {
// Code
}
JIT CLR будет специальный случай этот тип цикла при определенных обстоятельствах, так как длина массива не может измениться. В тех случаях проверка границ только произойдет однажды.
Ссылка: http://blogs.msdn.com/brada/archive/2005/04/23/411321.aspx
Количество было бы оценено на каждой передаче. Если бы Вы продолжали добавлять к набору, и итератор никогда не нагонял, то у Вас был бы бесконечный цикл.
class Program
{
static void Main(string[] args)
{
List<int> intCollection = new List<int>();
for(int i=-1;i < intCollection.Count;i++)
{
intCollection.Add(i + 1);
}
}
}
Это в конечном счете доберется из исключения памяти.
Да, счетчик проверяется при каждом вызове от первой итерации после инициализации i до последней итерации, когда проверка завершается неудачно и цикл for завершается. Вы можете изменить количество коллекций, если хотите, но понимаете, что можете оказаться в бесконечном цикле.
Примечание стороны, это НЕ проверяется на каждое взаимодействие в VB.
В отличие от C#, VB кэширует результат набора. Количество.
РЕДАКТИРОВАНИЕ:
литеральная версия VB C# для цикла:
Dim i = 0
Do While i < collection.Count
'code goes here
i+=1
Loop