He pasado las últimas 2 horas en esto y probablemente he leído todas las preguntas aquí relacionadas con las variables que se pasan a las funciones. Mi problema es el común del parámetro/argumento que se ve afectado por los cambios realizados dentro de la función, aunque eliminé la referencia/alias usando variable_cloned = variable[:]
en la función para copiar los contenidos sin la referencia.El argumento/parámetro pasado en la función todavía se está cambiando después de eliminar la referencia/alias
Aquí está el código:
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
Lo que estoy notando es que el parámetro 'm' en la función está cambiando, como si es un alias de m_cloned - pero por lo que yo puedo decir que tengo eliminó el alias con la primera línea de la función. En todas partes que he buscado en línea parece sugerir que esta línea se asegurará de que no haya ninguna referencia al parámetro, pero no está funcionando.
Estoy seguro de que debo haber cometido un simple error, pero después de 2 horas no creo que vaya a encontrarlo.
"... aunque he eliminado la referencia/alias usando variable_cloned = variable [:] en la función para copiar los contenidos sin la referencia. " Esto hace que 'variable_cloned' se refiera a una lista separada de' variable', pero las dos listas contendrán contenidos idénticos: referencias a sus tres listas (de 2 elementos). –