初始化python类的实例时,私有变量的值与上一个实例的相同,问题定位

本文通过一个具体的Python类构造示例,展示了使用可变类型作为函数默认参数时可能遇到的问题,并提出了安全的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/usr/bin/env python
# -*- Coding=UTF-8 -*-

class parser:
    def __init__(self, x=[]):
        print "early-init: id(x) = %s" % id(x)
        self.numbers = x
        print "post-init: id(self.numbers) = %s, id(x) = %s" % (id(self.numbers), id(x))
    def load(self):
        for i in range(0, 10):
            self.numbers.append(i)

p = parser()
p.load()
print "len(p.numbers): %s " % len(p.numbers)
p1 = parser()
print "len(p1.numbers): %s " % len(p1.numbers)

 上述代码的运行结果为:

early-init: id(x) = 4531521656
post-init: id(self.numbers) = 4531521656, id(x) = 4531521656
len(p.numbers): 10
early-init: id(x) = 4531521656
post-init: id(self.numbers) = 4531521656, id(x) = 4531521656
len(p1.numbers): 10

 原因很明显,__init__的默认输入参数x的地址是不变的。
如果初始化实例p时,没有指定参数,那么将拷贝x的值到p.numbers,修改了p.numbers的内容,也就是修改了x的内容。
初始化p1时,参数没有指定,使用默认值x,x的内容已经被p.numbers修改,不再是[]。
安全的做法是self.numbers = x[:]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值