Python代码二次循环触发AttributeError错误的原因排查
问题排查:Python循环中出现AttributeError: 'str' object has no attribute 'letters'
先看看你提供的代码:
import random import string for x in range(0,15): print "something" string= str(random.choice(string.letters)+str(random.randint(100,10000))+random.choice(string.letters)+str(random.randint(0,100))) print string
以及报错信息:
something J6554r15 something
Traceback (most recent call last):
File "C:\Users\test\Desktop\soooo.py", line 8, in
string= str(random.choice(string.letters)+str(random.randint(100,10000))+random.choice(string.letters)+str(random.randint(0,100)))
AttributeError: 'str' object has no attribute 'letters'
问题原因
这是典型的变量名与模块名冲突搞出来的问题!
- 一开始你导入了
string模块,这时候string指向的是标准库的string模块对象,它有letters属性(注:Python3里这个属性已经改成string.ascii_letters,你这里应该是Python2环境)。 - 第一次循环执行到
string= str(...)这行时,你把生成的字符串赋值给了变量string,直接把原来的string模块给覆盖掉了! - 所以第二次进入循环时,
string已经变成了一个普通字符串对象,而字符串根本没有letters属性,自然就抛出了这个错误。
解决办法
把你的变量名改个名字,别和模块名重名就行,比如改成random_str:
import random import string for x in range(0,15): print "something" random_str = str(random.choice(string.letters) + str(random.randint(100,10000)) + random.choice(string.letters) + str(random.randint(0,100))) print random_str
这样每次循环访问string.letters时,都是指向原来的string模块,就不会再报错啦。
内容的提问来源于stack exchange,提问作者Sarvesh EB
相关产品推荐
相关产品推荐

