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”如何解决


7 回复

求教,正在慢慢摸索中


这个报错是因为你在函数内部对变量 id 进行了赋值操作,但在赋值之前就引用了它。Python会把它当作局部变量,而你在使用它的时候它还没被定义。

最常见的情况是,你在函数里用了 id = ... 这样的赋值,同时又想用外层的 id(比如内置函数 id() 或者全局变量)。

看个例子:

def process_data(data):
    # 这里想用内置函数id()获取内存地址
    print(f"Object id: {id(data)}")  # 这里会报错!
    
    # 后面又给id赋值了
    id = "user_123"
    return id

解决方法:

  1. 最简单的:改个变量名,别用 id 这个内置函数名:
def process_data(data):
    print(f"Object id: {id(data)}")  # 现在能正常使用内置函数了
    
    user_id = "user_123"  # 改个名字
    return user_id
  1. 如果非要保留变量名:明确声明你要用全局的 id
def process_data(data):
    global id  # 声明使用全局的id
    print(f"Object id: {id(data)}")
    
    id = "user_123"  # 这会修改全局的id,通常不建议这样做
    return id
  1. 或者用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 特有?

回到顶部