如何理解python中的变量作用域?

2024-09-30 02:14:52 发布

您现在位置:Python中文网/ 问答频道 /正文

def gibsSample(pB,pC,pA_B,pD_BC,pE_D,pF_C,label_A,label_B,label_C,label_D,label_E,label_F,T):
    #initial state
    sample=['A=F','B=n','C=F','D=h','E=F','F=F']
    sampleState=[]
    for i in range(T):
        #draw sample A from p(A | B,C,D,E,F)
        sample_A=sampleA(sample,pA_B)
        sample[0]=sample_A
        #draw sample B from p(B | A,C,D,E,F)
        sample_B=sampleB(sample,pB,pA_B,pD_BC)
        sample[1]=sample_B
        #draw sample C from p(C | A,B,D,E,F)
        sample_C=sampleC(sample,pC,pD_BC,pF_C)
        sample[2]=sample_C
        #draw sample D from p(D | A,B,C,E,F)
        sample_D=sampleD(sample,pD_BC,pE_D)
        sample[3]=sample_D
        #draw sample E from p(E | A,B,C,D,F)
        sample_E=sampleE(sample,pE_D)
        sample[4]=sample_E
        #draw sample F from p(F | A,B,C,D,E)
        sample_F=sampleF(sample,pF_C)
        sample[5]=sample_F
        sampleState.append(sample)
    return sampleState

我写了一个示例算法。每次我从一个分布中采样后,变量“sample”中的元素都会被修改,在一个圆之后,我想将它附加到列表“sampleState”中。但是为什么“sampleState”似乎只附加了最初的“sample”,而没有附加我修改的sample呢?我对循环进行了2000次迭代,‘sampleState’中的所有元素都与初始状态相同,但我在每次迭代中都检查了‘sample’,没有问题


Tags: samplefrom元素deflabelpdpebc
2条回答

每次将sample附加到列表中时,都会将引用附加到完全相同的对象

在每次循环之后,您都要更改这个对象内部的值(在sample列表的每个索引处的值),因此如果列表中的所有对象都指向同一个对象,它们将看到相同的值

要解决此问题,请在每个循环的末尾创建一个新列表:

    def gibsSample(pB,pC,pA_B,pD_BC,pE_D,pF_C,label_A,label_B,label_C,label_D,label_E,label_F,T):
        #initial state
        sample=['A=F','B=n','C=F','D=h','E=F','F=F']
        sampleState=[]
        for i in range(T):
            #draw sample A from p(A | B,C,D,E,F)
            sample_A=sampleA(sample,pA_B)
            sample[0]=sample_A
            #draw sample B from p(B | A,C,D,E,F)
            sample_B=sampleB(sample,pB,pA_B,pD_BC)
            sample[1]=sample_B
            #draw sample C from p(C | A,B,D,E,F)
            sample_C=sampleC(sample,pC,pD_BC,pF_C)
            sample[2]=sample_C
            #draw sample D from p(D | A,B,C,E,F)
            sample_D=sampleD(sample,pD_BC,pE_D)
            sample[3]=sample_D
            #draw sample E from p(E | A,B,C,D,F)
            sample_E=sampleE(sample,pE_D)
            sample[4]=sample_E
            #draw sample F from p(F | A,B,C,D,E)
            sample_F=sampleF(sample,pF_C)
            sample[5]=sample_F
            sampleState.append(list(sample)) # here you create a copy of your "sample"
        return sampleState

替代解决方案

因为您使用的是固定大小的列表,所以可能还需要使用6元组:

def gibsSample(pB,pC,pA_B,pD_BC,pE_D,pF_C,label_A,label_B,label_C,label_D,label_E,label_F,T):
    #initial state
    sample=('A=F','B=n','C=F','D=h','E=F','F=F')
    sampleState=[]
    for i in range(T):
        #draw sample A from p(A | B,C,D,E,F)
        sample_A=sampleA(sample,pA_B)

        #draw sample B from p(B | A,C,D,E,F)
        sample_B=sampleB(sample,pB,pA_B,pD_BC)

        #draw sample C from p(C | A,B,D,E,F)
        sample_C=sampleC(sample,pC,pD_BC,pF_C)

        #draw sample D from p(D | A,B,C,E,F)
        sample_D=sampleD(sample,pD_BC,pE_D)

        #draw sample E from p(E | A,B,C,D,F)
        sample_E=sampleE(sample,pE_D)

        #draw sample F from p(F | A,B,C,D,E)
        sample_F=sampleF(sample,pF_C)

        t = (sample_A, sample_B, sample_C, sample_D, sample_E, sample_F)
        sampleState.append(t)
    return sampleState

你要找的是函数中的静态变量。正如在this问题中所描述的,您需要在代码的任何地方用gibsSample.sample替换sample

def gibsSample(pB,pC,pA_B,pD_BC,pE_D,pF_C,label_A,label_B,label_C,label_D,label_E,label_F,T):
    #initial state
    gibsSample.sample=['A=F','B=n','C=F','D=h','E=F','F=F']
    sampleState=[]
    for i in range(T):
        #draw sample A from p(A | B,C,D,E,F)
        sample_A=sampleA(gibsSample.sample,pA_B)
        gibsSample.sample[0]=sample_A
        #draw sample B from p(B | A,C,D,E,F)
        sample_B=sampleB(gibsSample.sample,pB,pA_B,pD_BC)
        gibsSample.sample[1]=sample_B
        #draw sample C from p(C | A,B,D,E,F)
        sample_C=sampleC(gibsSample.sample,pC,pD_BC,pF_C)
        gibsSample.sample[2]=sample_C
        #draw sample D from p(D | A,B,C,E,F)
        sample_D=sampleD(gibsSample.sample,pD_BC,pE_D)
        gibsSample.sample[3]=sample_D
        #draw sample E from p(E | A,B,C,D,F)
        sample_E=sampleE(gibsSample.sample,pE_D)
        gibsSample.sample[4]=sample_E
        #draw sample F from p(F | A,B,C,D,E)
        sample_F=sampleF(gibsSample.sample,pF_C)
        gibsSample.sample[5]=sample_F
        sampleState.append(gibsSample.sample)
        gibsSample.sample = [None] * 6
    return sampleState

相关问题 更多 >

    热门问题