1

次のコードがあります(基本的なセルオートマトンを生成します):

def cellular_automaton(init_string,pattern,gens):
    values=[128,64,32,16,8,4,2,1]
    pattern_list=[]
    k=0
    while k<len(values):
        if values[k]+sum(pattern_list)<=pattern:
            pattern_list.append(values[k])
        k=k+1



    i=0
    j=0
    b=[]
    f=''

    pos_init=[0,1,0]
    pos_interm=[]
    pos_init=[[n,n+1,n] for n in range(len(init_string)-1)]
    pos_interm.append(pos_init)
    pos_interm[-1][-1].append(len(init_string)-1)
    pos_interm[-1][-1].append(0)
    pos_interm[0][0].insert(0,len(init_string)-1)
    pos_interm2=[val for subl in pos_interm for val in subl]
    pos=[val for subl in pos_interm2 for val in subl]

    b.append(pos)
    while j<gens:
        pos=[i+len(init_string) for i in pos]
        b.append(pos)
        j=j+1
        c=[val for subl in b for val in subl]



    while i<len(c):
        if init_string[c[i]]=='.' and init_string[c[i+1]]=='.' and init_string[c[i+2]]=='.':
            if 1 in pattern_list:
                init_string=init_string+'x'
            else:
                init_string=init_string+'.'
        elif init_string[c[i]]=='.' and init_string[c[i+1]]=='.' and init_string[c[i+2]]=='x':
            if 2 in pattern_list:
                init_string=init_string+'x'
            else:
                init_string=init_string+'.'
        elif init_string[c[i]]=='.' and init_string[c[i+1]]=='x' and init_string[c[i+2]]=='.':
            if 4 in pattern_list:
                init_string=init_string+'x'
            else:
                init_string=init_string+'.'
        elif init_string[c[i]]=='.' and init_string[c[i+1]]=='x' and init_string[c[i+2]]=='x':
            if 8 in pattern_list:
                init_string=init_string+'x'
            else:
                init_string=init_string+'.'
        elif init_string[c[i]]=='x' and init_string[c[i+1]]=='.' and init_string[c[i+2]]=='.':
            if 16 in pattern_list:
                init_string=init_string+'x'
            else:
                init_string=init_string+'.'
        elif init_string[c[i]]=='x' and init_string[c[i+1]]=='.' and init_string[c[i+2]]=='x':
            if 32 in pattern_list:
                init_string=init_string+'x'
            else:
                init_string=init_string+'.'
        elif init_string[c[i]]=='x' and init_string[c[i+1]]=='x' and init_string[c[i+2]]=='.':
            if 64 in pattern_list:
                init_string=init_string+'x'
            else:
                init_string=init_string+'.'
        elif init_string[c[i]]=='x' and init_string[c[i+1]]=='x' and init_string[c[i+2]]=='x':
            if 128 in pattern_list:
               init_string=init_string+'x'
            else:
                init_string=init_string+'.'





        i=i+3





    return init_string[(len(pos_interm2)+1)*-2:(len(pos_interm2)+1)*-1]

出力は次のように生成されます。

print cellular_automaton('.x.x.x.x.', 17, 2)

このコードは Python 3.3.2 では問題なく動作しますが、Python 2.7 では「string index out of range」エラーが発生します。

Traceback (most recent call last):
  File "vm_main.py", line 33, in <module>
    import main
  File "/tmp/vmuser_trwqmlfqgq/main.py", line 143, in <module>
    print cellular_automaton('.x.x.x.x.', 17, 2)
  File "/tmp/vmuser_trwqmlfqgq/main.py", line 95, in cellular_automaton
    if init_string[c[i]]=='.' and init_string[c[i+1]]=='.' and init_string[c[i+2]]=='.':
IndexError: string index out of range

私は Py2 と Py3 の違いにあまり詳しくないので、Python 2.7 でも動作させるにはどうすればよいかを誰かが教えてくれたらうれしいです。Py2でこのインデックスエラーが発生するのはなぜですか?

4

1 に答える 1

11
pos=[i+len(init_string) for i in pos]

iPython 2 では、元の初期化された の値を上書きする最後の値がリークします0。そのため、Python 2 はインデックス 8 から開始され、後でインデックス エラーが発生します。

これを修正するには、その変数に別の名前を付けます。

pos=[k+len(init_string) for k in pos]

これのより明確な例を示すために、通訳セッションでこれをテストできます。Python 3 は の元の値を正しく保持しますi:

>>> i = 0
>>> [i for i in range(5)]
[0, 1, 2, 3, 4]
>>> i
0

ただし、Python 2 はループの最後の値をリスト内包表記内に保持します。

>>> i = 0
>>> [i for i in range(5)]
[0, 1, 2, 3, 4]
>>> i
4

この変更の詳細については、この回答も参照してください。

于 2013-09-28T15:43:44.430 に答える