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]

「I」が「regs」とともに変更されると、これがどのように起こるかわかりません。「I」はコード内で変更されることはありません。私の課題に何か問題がありますか?

補遺: リニア フィードバック シフト レジスタを実装しようとしています。コードは、LFSR の周期性を計算することです。regs は初期状態です。I は、regs が再び初期状態に戻るタイミングをチェックするために使用され (周期性を計算するため)、temp は、別の初期化された変数もシフトされるかどうかを確認するための単なるテスト変数です。

4

2 に答える 2

2

もちろん、この割り当てを行ったため、次のようIに変更されます。regs

I=regs

ここで、同じリストIを参照します。regsそれが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コピーします。したがって、同じ配列を作成します。regsIregs

于 2013-08-07T06:36:58.453 に答える