Фактически функция y in и функция y в главной функции имеют одно и то же имя, но не являются одной и той же переменной, а являются просто ссылкой на один и тот же объект.но как только вы сделаете присваивание y в функции, вы создаете новый объект
. Чтобы сделать это более понятным, я переименовал y в функции () в yy
def function(yy):
yy=yy[:3] # Rewrite the list
return yy
y=[0,1,2,3,4]
y = function(y) # here I assign the result of the function call to y
print(y)
ТеперьВторое решение, которое может сбить вас с толку, поскольку, кажется, противоречит тому, что я сказал ранее.
def function(yy):
yy[:]=yy[:3] # Rewrite the list
y=[0,1,2,3,4]
function(y) # here nothing is assigned. function directly modifies the passed object
print(y)
Фактически следующий код в функции y = y[:3]
создает новый список, который содержит первые три элемента y иприсваивает его переменной, которая будет называться y, но которая является новым объектом.
Код y[:] = y[:3]
говорит, что нужно сохранить тот же объект y, но заменить все его элементы первыми тремя элементамииз y.
Итак, снова предыдущий код, но теперь с отладочной печатью:
def function(y):
print("The id of y is ", id(y))
y=y[:3] # Rewrite the list
print("The id of y is ", id(y)) # you created a new object
return y
y=[0,1,2,3,4]
print("The id of y is ", id(y))
y = function(y) # here I assign the result of the function call to y
print(y)
print("The id of y is ", id(y)) # you got a new object, that is no stored in y
А теперь другой код с отладочной печатью: def function (y): print ("Идентификаторy is ", id (y)) y [:] = y [: 3] # Перепишите список print (" Идентификатор y is ", id (y))
y=[0,1,2,3,4]
print("The id of y is ", id(y))
function(y) # here nothing is assigned. function directly modified the passed object
print("The id of y is ", id(y))
print(y)