Почему я не могу переписать список в определяемой пользователем функции? - PullRequest
1 голос
/ 29 сентября 2019

Я собираюсь переписать список в пользовательской функции, просто используя собственное имя, а не любую встроенную функцию списка, но это не работает.

Использование встроенной функцииФункции (.append, del и т. д.) для изменения списка работают, но я все еще удивляюсь, почему перезапись не работает.Я упрощаю свой код, чтобы показать основную проблему.

def function(y):
    y=y[:3]  # Rewrite the list
    return y


y=[0,1,2,3,4]
function(y)
print(y)

ожидается: [0,1,2] актуально: [0, 1, 2, 3, 4]

1 Ответ

3 голосов
/ 29 сентября 2019

Фактически функция 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...