2016-04-09 14 views
1

Ich schreibe ein Programm, das eine erste Sequenz und führt 3 Funktionen auf und spuckt dann die 3 Antworten aus, aber ich möchte die ursprüngliche Variable intakt, so dass es wiederverwendet werden kann. Von im Forum habe ich festgestellt, dass die Variable innerhalb einer Funktion lokal sein sollte, aber es scheint global zu handeln.Variable innerhalb einer Funktion scheint nicht lokal

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)) 

Ich würde erwarten, zu bekommen:

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]) 

sondern ich:

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]) 

also warum ist innerhalb der Funktion nicht meine lokale Variable? gibt es eine Möglichkeit, die Ausgabe innerhalb der Funktion umbenennen, so dass es nicht die gleiche Kennung initial_state verwendet? Ich bin ziemlich neu in der Programmierung, so dass über die Erklärung geschätzt werden würde.

Antwort

1

Per the docs for deque.reverse:

die Elemente der deque umkehren in-place und dann None zurück.

(meine Betonung). Deshalb

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

row_exchange(initial_state) 

modifiziert initial_state. Beachten Sie, dass append, appendleft und insert auch die deque an Ort und Stelle ändern.


ohne Zum Umkehren t inplace Ändern Sie

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

In jeder der Funktionen nutzen könnten, ist t eine lokale Variable. Der Effekt, den Sie sehen, ist nicht, weil t irgendwie global ist - es ist nicht. In der Tat würden Sie eine NameError erhalten, wenn Sie versuchten, im globalen Geltungsbereich auf t zu verweisen.


Für mehr auf, warum eine lokale Variable zu modifizieren einen Wert außerhalb des lokalen Bereich beeinflussen können, finden Sie Ned Batchelder des Facts and myths about Python names and values. Sehen Sie sich insbesondere die Diskussion der Funktion augment_twice an.