问题复现
问题来源
前两天看公众号发现有一个新手比较容易犯错的问题 问题如下
代码如下:
import requests
import json
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s: %(message)s...')
class Myspider():
def __init__(self):
self.url = "http://www.xinfadi.com.cn/getPriceData.html"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
self.data = {
"limit": 20,
"current": '',
"pubDateStartTime": "",
"pubDateEndTime": "",
"prodPcatid": "",
"prodCatid": "",
"prodName": ""
}
self.formdata = []
def create_formdata(self):
for i in range(1, 10):
print(i)
self.data['current'] = i
print(self.data)
self.formdata.append(self.data)
def get_html(self):
for item in self.formdata:
print(item)
# html = requests.post(self.url, self.headers, item)
# html = json.loads(html.text)
# print(html['current'])
def run(self):
self.create_formdata()
self.get_html()
if __name__ == "__main__":
spider = Myspider()
spider.run()
运行输出如下:
问题分析
功能解析
根据代码和聊天记录可以看出这个bug制造者希望self.formdata列表当中的字典的current分别为1 2 3 …9 但是最后的解析却全部都是9
问题分析
循环第一次的时候如下图所示,self.data中的current为1 在self.formdate中添加了一条数据
第二次循环时如下图 current如意料中的一样为2 之后在formdata当中继续添加了一个self.data但是此时请注意:formdata中的第一条数据已经发生了改变!!!第一条数据的current已经变成了2并不是为1
这个脚本犯的错误是 群友认为self.formdata当中写入了self.data之后写入的数据就不会发生改变 我们可以从上面的输出当中看出 在create_formdata当中self.data确实是如同预想的一样current分别为1 2 3 …9但是为什么最后却全是9呢
因为 这样书写得到的self.formdata可以理解为:
self.formdata = [self.data,self.data,self.data,self.data,self.data,self.data,self.data,self.data,self.data, ]
实例参数 self.formdata当中装的全是self.data当最后一次循环结束之后current为9 所以最后输出来全部为9
修改
def create_formdata(self):
for i in range(1, 10):
print(i)
data = {
"limit": 20,
"current": i,
"pubDateStartTime": "",
"pubDateEndTime": "",
"prodPcatid": "",
"prodCatid": "",
"prodName": ""
}
self.formdata.append(data)
总结
理解实例属性 和变量之间的区别