2017-01-31 6 views
0

Es ist eine Weile her, seit ich Python verwendet habe, und dieses bekomme ich wirklich nicht: - Ich mache eine Liste von Strings M1 - Ich kopiere es auf M2 - Dann ändere ich ein "e" auf "E" mit re in M1 - M2 wird auch geändert!Re ändert auch die zuvor kopierte Liste der Strings

Hier ist ein Code für diejenigen, die interessiert sind. Es zeigt dieses Verhalten auf Anaconda2 und Python 3.6.0.

import re 

# Normal operation on single strings 
m1 = "Hello." 
m2 = m1 
m1 = re.sub("e", "E", m1) 
print(m1) 
print(m2) 
print("") 

# Normal operation on one list of strings 
M = ["Hello.", "Bye-bye!"] 
for i in range(len(M)): 
    M[i] = re.sub("e", "E", M[i]) 
print (M) 
print("") 

# Unexpected behaviour on a copied list of strings 
M1 = ["Hello.", "Bye-bye!"] 
M2 = M1 
for i in range(len(M1)): 
    M1[i] = re.sub("e", "E", M1[i]) 
print(M1) 
print(M2) 
+0

M2 = M1 nicht eine neue Zeichenfolge mit dem gleichen Inhalt liefert, seinen nur einen Verweis auf die alte Zeichenfolge. Verwenden Sie zum Beispiel deepcopy() – Humbalan

+0

Super! Ich hatte keine Ahnung, dass Python mit solchen Zeigern arbeitet. Zeit, etwas Python-Theorie für mich zu lesen, denke ich. – user3766450

Antwort

1

m2 = m1 zeigt m2 auf dasselbe Objekt, auf das m1 zeigt. Es ist, als ob du einen Zeiger kopierst. Wenn Sie den Inhalt kopieren möchten, könnten Sie etwas wie m2 = m1[:] tun.

Verwandte Themen