Jane_Python学习ing 2023-01-15 22:25 采纳率: 66.7%
浏览 30
已结题

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被重复用的话会出现这样一个结果
  • 写回答

3条回答 默认 最新

  • 於黾 2023-01-16 08:49
    关注

    输入的文件是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修改之后的值

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月24日
  • 已采纳回答 1月16日
  • 提问应符合社区要求 1月15日
  • 创建了问题 1月15日