2016-04-09 16 views
1

最初のシーケンスをとり、3つの関数を実行して3つの答えを吐き出すプログラムを作成しますが、再利用できるように元の変数を元のままにします。フォーラムのother answersから、私は、関数内の変数はローカルでなければならないと結論づけましたが、グローバルに動作しているようです。関数内の変数はローカルではないようです

from collections import deque 
from sys import exit 
initial_state = (1,2,3,4,5,6,7,8) 
initial_state = deque(initial_state) 

def row_exchange(t): 
    t.reverse() 
    return t 
def rt_circ_shift(t): 
    t.appendleft(t[3]) 
    del t[4] 
    t.append(t[4]) 
    del t[4] 
    return t 
def md_clk_rot (t): 
    t.insert(1,t[6]) 
    del t[7] 
    t.insert(3,t[4]) 
    del t[5] 
    t.insert(4,t[5]) 
    del t[6] 
    return t 



print(row_exchange(initial_state)) 
print(initial_state) 
print(rt_circ_shift(initial_state)) 
print(md_clk_rot(initial_state)) 

私が得ることを期待する:

deque([8, 7, 6, 5, 4, 3, 2, 1]) 
deque([1, 2, 3, 4, 5, 6, 7, 8]) 
deque([4, 1, 2, 3, 6, 7, 8, 5]) 
deque([1, 7, 2, 4, 5, 3, 6, 8]) 

を代わりに私が手:

deque([8, 7, 6, 5, 4, 3, 2, 1]) 
deque([8, 7, 6, 5, 4, 3, 2, 1]) 
deque([5, 8, 7, 6, 3, 2, 1, 4]) 
deque([5, 1, 8, 6, 3, 7, 2, 4]) 

なぜ関数内のローカル変数の私ではないのですか? そこに私は同じ識別子initial_stateを使用していないように関数内の出力の名前を変更する方法はありますか? 私はかなりプログラミングに新しいので、説明以上に感謝します。 the docs for deque.reverseパー

答えて

1

インプレース両端キュー の要素を逆にして、Noneを返し

(私の強調)。したがって、

def row_exchange(t): 
    t.reverse() 
    return t 

row_exchange(initial_state) 

initial_stateを変更します。 append,appendleftおよびinsertも、dequeをインプレースで変更します。


tインプレースを変更することなく、逆にするには、あなたがの各機能で

def row_exchange(t): 
    return deque(reversed(t)) 

を使用することができ、tはローカル変数です。 tは何とかグローバルであるため、あなたが見ている効果は ではありません。実際には、tをグローバルスコープで参照しようとすると、 NameErrorが得られます。ローカル変数を変更する理由の詳細について


ネッドBatchelderのFacts and myths about Python names and valuesを参照してください、ローカルスコープ外の値に影響を与えることができます。特に、関数augment_twiceの議論を見てください。

関連する問題