for循环i被重新赋值

i被重新赋值的问题
我知道i在for循环里被重新赋值了,但为什么如果验证码改成6位以下没问题,改成6位及以上就会占位.jpg
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答

```python
import random
file = input('请输入文件名称:')
if file.endswith('jpg') or file.endswith('gif') or file.endswith('png'):
i = file.find('.')
name = file[0:i]
if len(name) < 6:
# 重新构建名字,产生字母和数字的组合名称
filename = ''
s = 'qwertyuiopasdfghjklzxcvbnm123456'
for i in range(6):
index = random.randint(0, len(s) - 1)
filename += s[index] # 获取下标匹配的字母
# filename 文件名和后缀进行拼接
new = filename + file[i:]
print('成功上传%s文件' % new)

else:
print('上传失败,格式错误')

```率下降 50%

请输入文件名称:123.jpg

成功上传a3cbadpg文件

为什么i在for循环里被重新赋值的话,最后结果有种x位数验证码占了.jpg的位置的感觉
我知道i被重新赋值了,只用修改for里面的变量改成上面没有用过的就行。但为什么i被重复用的话会出现这样一个结果

输入的文件是123.jpg
i本来是3
你把i改了,它从0到5循环,那后面file[i:]可就不是.jpg了,它变成g了
-=-=-=-=
更本质的原因在于,python没有c语言里块的概念
在c语言里,块内定义的同名变量出了块生命周期就到了,块前定义一个int i=0,块内定义成int i=1,块后i的值还是0,还是块前的那个i
而python里所有定义的对象作用域都是整个代码,只有类和函数有变量隔离的作用,什么if,for,都不会生成一个新的块,这导致在for中修改i之后,出了for,i的值还保留了被for修改之后的值

因为这里 new = filename + file[i:],你的i重新赋值了之后,这里i原本应该是.的索引,现在也被改了


import random

file = input('请输入文件名称:')
if file.endswith('jpg') or file.endswith('gif') or file.endswith('png'):
    i = file.find('.')
    name = file[0:i]
    if len(name) < 6:
        # 重新构建名字,产生字母和数字的组合名称
        name = '' #重新构建name
        s = 'qwertyuiopasdfghjklzxcvbnm123456'
        for i in range(6):
            index = random.randint(0, len(s) - 1)
            name += s[index]  # 获取下标匹配的字母
        # filename 文件名和后缀进行拼接
    name = name + file[i:]
    print('成功上传%s文件' % name)

else:
    print('上传失败,格式错误')

img