python连续赋值_python中for循环赋值奇怪问题

光看截图我就觉得 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这个对象的地址

新字典一次都没用过,所以你的编辑器给你灰色加亮提示了

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值