for循环原理可以看这篇
http://t.csdn.cn/CZNpF
然后print(i)放在首位会报错是因为此时i没有加入到内存当中,所以找不到i这个变量,之后那种情况又可以是因为此前i已经加入到内存中了,因为for循环那个语句先执行,所以这个时候i在内存当中
1:for 循环用于遍历一个迭代对象的所有元素。循环内的语句段会针对迭代对象的每一个元素项目都执行一次。暂且可以将迭代对象想象成一个对象集合
如果print(i) 放在首位 报错是因为 没有定义找不到i这个变量
其次total不报错是因为 已经全局声明 了 所以可以在循环里面不断去进行一个自+i的重新赋值
不知道你这个问题是否已经解决, 如果还没有解决的话: