Python和科学计算认证群组  - 讨论区

标题:关于变量id的问题

2012年02月26日 星期日 12:26

蓝色是代码(无关语句已被省去):

(1) 一系列复杂操作得到对象AAA的实例A

(2) bestScore=0
(3) for k in range(100):
(4)     A.ChangeSomething()
(5)     if A.score>bestScore:
(6)        bestScore=A.score
(7)       
bestA=A

因为bestA=A只创建了A的一个引用,上面的代码bestA永远是k=99时的A!我尝试在bestA=A后对bestA做一些属性的改动,结果也无济于事。好像只有在bestA=A后面强制改变bestA的id才是最省事的方法。是不是该这么解决?

注:1.(1)比较复杂。若在这一步生成两个实例:(1)—A,(1)'—bestA,这个(1)'很长的;
      2.(4)Change的属性也较多。若将(7)改成:bestA.attriChanged=A.attriChanged,也比较烦;

 

2012年02月26日 星期日 12:35

这要看AAA类是如何定义的,以及A.ChangeSomething()做了些什么。不知道你是如何强制改变bestA的id的,这个应该是不可能的吧。

你可以试着复制一份A,例如用copy模块中的copy或者deepcopy。bestA=copy(A)或者bestA=deepcopy(A)。

但是需要知道完整的代码才能给出合理的方案。

2012年02月26日 星期日 13:10

呵呵,我也不知道怎么改id,只是想想罢了。先试试你说的copy吧

2012年02月26日 星期日 16:06

我的工作电脑不能上网,暂时还不能把代码发上来 我下午试了copy和deepcopy,都有问题! 使用copy后 bestA和A的id不相同了, 但是, 只要实例属性属于所有AAA的静态数据或者在__init__函数中添加的属性, 就有id(bestA.此类属性)==id(A.此类属性)

2012年02月26日 星期日 17:48

总之我就是想根据已有的实例A,复制一个A1,A1的属性取值和A是相等的,但所有属性都不是引用。

 

可不可以这样做:

给AAA定义一个特殊的函数AAA.Copy(self,A),输入为AAA的实例A,返回一个新的实例A1,

在函数内A1调用copy模块复制A的所有属性

 

2012年02月26日 星期日 17:58

直接对实例使用copy或者deepcopy,

如A1=copy.deepcopy(A),

此时,有一些属性是真正的备份,而那些类的静态属性和构造函数里添加的属性都是引用。

2012年02月26日 星期日 18:45

类的静态属性当然不会复制到bestA中,类的静态属性是类的,不是实例的。还是看到程序之后再讨论吧。

2012年02月27日 星期一 13:01

应该把hassub, Beam之类的当作是实例的属性,而不是类的属性:

from copy import deepcopy
class Params(object):
    pass

def IdentifyF(lamda):
    '确定天线频段'
    if lamda>100: fband=u'广播段'
    elif lamda<=100 and lamda>10: fband=u'HF(高频)'
    else: fband=u'UHF(超高频)'    
    return fband

class ArrayAnt(object):
    '基类'
    c=3e8 #光速
    def __init__(self,lamda=2.5e-2,u0=0,v0=0):
        self.hassub = 0
        self.Beam = Params()
        self.PM = Params()
        self.Wopt = Params()
        self.Wsub = Params()
        self.Werror = Params()
        self.lamda=lamda #天线设计的工作波长
        self.f=self.c/self.lamda #
        self.fband=IdentifyF(lamda)
        self.Beam.u=u0 #天线波束指向
        self.Beam.v=v0

a = ArrayAnt()
a.Beam.u = 1.0

= deepcopy(a)
a.Beam.u = 2.0
print b.Beam.u

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号