Spędziłem ostatnie 2 godziny na tym i prawdopodobnie przeczytałem każde pytanie tutaj odnoszące się do zmiennych przekazywanych do funkcji. Mój problem jest typowy dla parametru/argumentu, na który wpływają zmiany wprowadzone w funkcji, mimo że usunąłem referencję/alias za pomocą funkcji variable_cloned = variable[:]
w funkcji kopiowania zawartości bez odniesienia.Podane argumenty/parametry w funkcji są wciąż zmieniane po usunięciu odniesienia/aliasu.
Oto kod:
def add_column(m):
#this should "clone" m without passing any reference on
m_cloned = m[:]
for index, element in enumerate(m_cloned):
# parameter m can be seen changing along with m_cloned even
# though 'm' is not touched during this function except to
# pass it's contents onto 'm_cloned'
print "This is parameter 'm' during the for loop...", m
m_cloned[index] += [0]
print "This is parameter 'm' at end of for loop...", m
print "This is variable 'm_cloned' at end of for loop...", m_cloned
print "m_cloned is m =", m_cloned is m, "implies there is no reference"
return m_cloned
matrix = [[3, 2], [5, 1], [4, 7]]
print "\n"
print "Variable 'matrix' before function:", matrix
print "\n"
add_column(matrix)
print "\n"
print "Variable 'matrix' after function:", matrix
Co mam zauważyć, że parametr „m” w funkcji zmienia się tak, jakby to aliasem m_cloned - ale o ile mogę powiedzieć, mam usunął alias z pierwszym wierszem funkcji. Gdziekolwiek indziej wyglądałem online wydaje się sugerować, że ta linia upewni się, że nie ma odniesienia do parametru - ale to nie działa.
Jestem pewien, że popełniłem prosty błąd, ale po 2 godzinach nie sądzę, żebym go znalazł.
"... mimo że usunąłem odniesienie/alias przy użyciu zmiennej_kloned = zmienna [:] w funkcji kopiowania treści bez odniesienia. " To sprawia, że 'zmienna_klikowana' odnosi się do osobnej listy z' zmiennej', ale obie listy będą zawierały identyczną zawartość: odniesienia do twoich trzech (2-elementowych) list. –