Python报错“local variable 'id' referenced before assignment”如何解决
def process_contenturl(url,picture,price,desc):#处理具体商品链接内容
a=requests.get(url)
change=etree.HTML(a.content)
l=change.xpath(’//div[@id=“attributes”]/ul/li/text()’)
stock=change.xpath(’//*[@id=“J_SpanStock”]/text()’)#获取商品库存
for i in range(len(l)):
l[i]=l[i].replace(u’\xa0’, ‘’)
if u"上市年份季节" in l[i]:
saleseason=(l[i])[7:]#上市年份季节
elif u"材质成分" in l[i] :
material=(l[i])[5:]#材质成分
elif u"货号" in l[i]:
id=(l[i])[3:]#货号
elif u"适用性别" in l[i]:
gender=(l[i])[5:]#适用性别
else:
remarks="".join(l)#无关紧要的备注
sql=“INSERT INTO UNIQLO(id,price,stock,salseason,material,gender,remarks,picture,desc) VALUE (%s,%s,%s,%s,%s,%s,%s,%s,%s)”%(id,price,stock,material,gender,remarks,picture,desc)
print sql
我这边写了这个,但是 print 的时候老是提醒,local variable ‘ id ’ referebced before assigment
这段函数我单独调用测试的时候没什么问题,一旦放入循环调用之后就会提示这个,
按照网上说的使用了 goable 的字段,但是也报错,不知道是哪里问题,求大神请教
Python报错“local variable ‘id’ referenced before assignment”如何解决
求教,正在慢慢摸索中
这个报错是因为你在函数内部对变量 id 进行了赋值操作,但在赋值之前就引用了它。Python会把它当作局部变量,而你在使用它的时候它还没被定义。
最常见的情况是,你在函数里用了 id = ... 这样的赋值,同时又想用外层的 id(比如内置函数 id() 或者全局变量)。
看个例子:
def process_data(data):
# 这里想用内置函数id()获取内存地址
print(f"Object id: {id(data)}") # 这里会报错!
# 后面又给id赋值了
id = "user_123"
return id
解决方法:
- 最简单的:改个变量名,别用
id这个内置函数名:
def process_data(data):
print(f"Object id: {id(data)}") # 现在能正常使用内置函数了
user_id = "user_123" # 改个名字
return user_id
- 如果非要保留变量名:明确声明你要用全局的
id:
def process_data(data):
global id # 声明使用全局的id
print(f"Object id: {id(data)}")
id = "user_123" # 这会修改全局的id,通常不建议这样做
return id
- 或者用nonlocal(如果在嵌套函数里):
def outer():
id = "outer_id"
def inner():
nonlocal id # 声明使用外层函数的id
print(f"Using id: {id}")
id = "inner_id" # 修改外层函数的id
inner()
print(id)
总结:别用内置函数名当变量名,改个名就完事了。
<br>def process_contenturl(url,picture,price,desc):#处理具体商品链接内容<br> a=requests.get(url)<br> change=etree.HTML(a.content)<br> l=change.xpath('//div[@id="attributes"]/ul/li/text()')<br> stock=change.xpath('//*[@id="J_SpanStock"]/text()')#获取商品库存<br> for i in range(len(l)):<br> l[i]=l[i].replace(u'\xa0', '')<br> if u"上市年份季节" in l[i]:<br> saleseason=(l[i])[7:]#上市年份季节<br> elif u"材质成分" in l[i] :<br> material=(l[i])[5:]#材质成分<br> elif u"货号" in l[i]:<br> id=(l[i])[3:]#货号<br> elif u"适用性别" in l[i]:<br> gender=(l[i])[5:]#适用性别<br> else:<br> remarks="".join(l)#无关紧要的备注<br> sql="INSERT INTO UNIQLO(id,price,stock,salseason,material,gender,remarks,picture,desc) VALUE (%s,%s,%s,%s,%s,%s,%s,%s,%s)"%(id,price,stock,material,gender,remarks,picture,desc)<br> print sql<br>
想想 id 什么时候才会被定义
这种情况,pycharm 会警告 local variable ‘ id ’ might be referebced before assigment 吧
这个我想了下,在前面定义了一个空的 id,但是现在做着发现了有一个错误,提示‘ gbk ’ codec cna’t encode character u’\xa0’in position 421:illegal multibyte sequence
这块,我已经在循环里面增加了
for i in range(len(l)):
l[i]=l[i].replace(u’\xa0’, ‘’)
为啥还是出现这个
一猜就是这个新手会遇到的坑
def func():
a = 0
def run():
print a
#a = 1
run()
func()
把 a=1 开启注释就会报你那个异常
貌似 python2 特有?

