光看截图我就觉得 getinfo() 有问题
一看后面,果然
手机占坑,电脑编辑
先给你看一段代码
def func(l, n):
# 没有return
l.append(n)
obj = []
for x in range(100):
# 也没有赋值
func(obj, x)
# 猜猜obj的长度
print(len(obj))
再看看这段代码
class PubClass:
@staticmethod
def getInfo(model, data):
info = model
# for k, v in vars(model).items():
# if isinstance(data, object):
# if hasattr(data, k):
# setattr(info, k, getattr(data, k))
# elif isinstance(data, dict):
# if k in data:
# setattr(info, k, data[k])
return info
@classmethod
def getList(cls, obj, data, toDict=True):
datalist = []
for d in data:
info = {} # 第一次赋值,列表引用
# if toDict:
# info = cls.getInfo(obj, d).__dict__
# else:
info = cls.getInfo(obj, d) # 第二次赋值,列表引用,覆盖
datalist.append(info)
return datalist
注释掉无关紧要的部分,这就是你的代码的实际作用
再精简一点就是下面这样
def getList(cls, obj, data, toDict=True):
datalist = []
for d in data:
info = obj
datalist.append(info)
return datalist
看出问题来了吗?
你连问题的原因都没找到,根本不是for的锅,而是引用造成的。
在Python中,参数除了基础类型是按值传递,其他都是按引用传递
getInfo()函数,传入的参数,返回值,实际上都是同一个内存地址的引用,info 或者说是obj
然后你把info这个变量,存进了datalist 列表,一共len(data)次
存的全部是同一个内存地址
如果你学过C语言的指针,你应该能理解
那么现在说说第二个问题:
info 第一次赋值,创建了一个空字典,并引用新字典的地址
第二次赋值,重新引用了obj这个对象的地址
新字典一次都没用过,所以你的编辑器给你灰色加亮提示了