0

我相信在基本上是 python 的 Sage 中工作。我给出了以下代码。

def lfsr_1(regs,tabs):
    I=regs
    leng=len(I)
    count=0
    while True:
        FB=0
        print "Before"
        print I
        print regs
        print temp
        for i in range(0,leng):
            FB=FB+tabs[i]*I[i]   //Calculating the feedback value
        for i in range(0,leng):
            regs[leng-(i+1)]=regs[leng-(i+1)-1] //Shifting regs one bit to the right
        I[0]=FB   //Adding the feedback at the end
        count=count+1  //Incrementing count value which will contain the periodicity
        print "After"
        print I
        print regs
        print temp
        if (I==regs):   //End when the initial state is repeated again. Now, count will contain the periodicity
            break

输入变量初始化如下

tabs=[GF(2)(1),0,0,1,1,1]
regs=[GF(2)(0),1,1,0,1,1]
temp=regs

但是,我得到的输出为:

Before
[0, 0, 1, 1, 0, 1]
[0, 0, 1, 1, 0, 1]
[0, 0, 1, 1, 0, 1]
After
[0, 0, 0, 1, 1, 0]
[0, 0, 0, 1, 1, 0]
[0, 0, 0, 1, 1, 0]

不知道这是如何发生的,因为“我”随着“regs”的变化而变化。“我”在代码中永远不会改变。我的作业有问题吗?

附录:尝试实现一个线性反馈移位寄存器。该代码用于计算 LFSR 的周期性。regs 是初始状态,I 用于检查 regs 何时再次返回初始状态(以计算周期性),而 temp 只是一个测试变量,以查看另一个初始化变量是否也会被移动。

4

2 回答 2

2

当然I会随着regs您进行此分配而发生变化:

I=regs

现在Iregs引用相同的列表。这就是 Python 的工作原理。列表变量仅引用列表对象,它不包含整个列表对象。

这是一个例子:

a = [1,2,3]
b = a
a[1] = 100
print b

也许您想I复制.regs

尝试:

I = regs[:]

当然,如果reg包含对象,您可能会有“结构共享”。

于 2013-08-07T06:36:45.250 回答
1

问题出在线路上

I=regs

当您这样做时,您不会复制 的内容regs而是复制对的引用regs。从而制作Iregs相同的数组。

于 2013-08-07T06:36:58.453 回答