注册 登录
编程论坛 Python论坛

【新人求助】python 基类字典被无故覆盖

zjkedy 发布于 2013-07-31 14:13, 1605 次点击
世纪代码太长,写了个类似的
程序代码:
class A():
    def __init__(self):
        pass
    def __del__(self):
        pass
    val={'1':'3'}

class B(A):
    def __init__(self):
        pass
    def __del__(self):
        pass
    def set_val(self):
        for _key, value in self.val.items():
            self.val['1'] = '4'
   
   
b = B()
a = A()
print "A---",a.val
print "B---",b.val
b.set_val()
print "A---",a.val
print "B---",b.val
结果:
    A---{‘1’:‘3’}
    B---{‘1’:‘3’}
    A---{‘1’:‘4’}
    B---{‘1’:‘4’}

为什么子类进行的字典操作,会影响基类?
3 回复
#2
davidlv4192013-10-06 12:44
回复 楼主 zjkedy
确实有这个问题,如果val是字符串就不会这个问题。
不知道为什么这里的变量val默认的变成了静态成员变量了。

[ 本帖最后由 davidlv419 于 2013-10-6 13:02 编辑 ]
#3
liufashuai2013-10-11 16:47
这个应该是python的基础知识了把

从两个方面考虑
1,首先你子类的变量没有定义,肯定是从继承过来的,所以,你的前面两个输出一样,且都是基类的值
2,当你在子类中设置了变量的值的时候,字典中的值变了,根本原因是:你子类和基类的两个变量不是一个变量,但是问题就出现在这里
他们是指针(学过C语言你就明白),指针就是存放的是地址,你子类和父类是两个不同变量,但是他们存放的都是同样的地址,因此你改变一个就会改变另外一个

python中这个要注意,这是python基础知识就应该注意的,你要想避免这种情况,就要复制字典,而不是简简单单的赋值(python解释器默认的处理过程)
这就像C++中的深拷贝,和浅拷贝(浅拷贝就是简单的复制,深拷贝就是遇见动态申请的空间,要重新申请,拷贝空间中的值,而不是简单给指针赋值)
这在C++ 中也是一个严重的问题
#4
wwei782102013-10-13 08:44
新手,求指教
1