注意python实例属性

问题复现

问题来源

前两天看公众号发现有一个新手比较容易犯错的问题 问题如下
在这里插入图片描述

代码如下:

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)

总结

理解实例属性 和变量之间的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值