| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1604 人关注过本帖
标题:【新人求助】python 基类字典被无故覆盖
只看楼主 加入收藏
zjkedy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:46
专家分:131
注 册:2010-5-14
收藏
 问题点数:0 回复次数:3 
【新人求助】python 基类字典被无故覆盖
世纪代码太长,写了个类似的
程序代码:
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’}

为什么子类进行的字典操作,会影响基类?
搜索更多相关主题的帖子: python 世纪 
2013-07-31 14:13
davidlv419
Rank: 2
等 级:论坛游民
帖 子:24
专家分:69
注 册:2009-4-30
收藏
得分:0 
回复 楼主 zjkedy
确实有这个问题,如果val是字符串就不会这个问题。
不知道为什么这里的变量val默认的变成了静态成员变量了。

[ 本帖最后由 davidlv419 于 2013-10-6 13:02 编辑 ]
2013-10-06 12:44
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:0 
这个应该是python的基础知识了把

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

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

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2013-10-11 16:47
wwei78210
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-10-13
收藏
得分:0 
新手,求指教
2013-10-13 08:44
快速回复:【新人求助】python 基类字典被无故覆盖
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024126 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved