Значение списка не обновляется после добавления - PullRequest
0 голосов
/ 07 ноября 2019

Вот мой оригинальный код:

friends_2017 = ["Robert","John","Smith"]
friends_2018 = ["Andy","David","Tim"]
new_friends = []
all_friends = friends_2017 + friends_2018 + new_friends
print(str(all_friends))
ask_friend = input("Who are you looking for")
if ask_friend in friends_2017:
    print(ask_friend,"is in 2017 friends list")
elif ask_friend in friends_2018:
    print(ask_friend,"is in 2018 friends list")
else:
    print("You don't have this friend")
add_friends = input("Who do you want to add?")
year = input("What year do you want to add them in?")
if year == "2017":
    friends_2017.append(add_friends)
elif year == "2018":
    friends_2018.append(add_friends)
else:
    new_friends.append(add_friends)
print(all_friends)

Я пытаюсь запросить у пользователя ввод и имя друга, если он совпадает со списком 2017 или 2018, то при выводе года, иначеэто создаст новый список.

if year == "2017":
    friends_2017.append(add_friends)
elif year == "2018":
    friends_2018.append(add_friends)
else:
    new_friends.append(add_friends)
print(all_friends)

Эта последняя часть, она должна обновлять оригинальный список после всех условий, однако не выводит новый список с новыми именами после всех условий выполнения. Могу я спросить, где я сделал не так?

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

+ создает список new из содержимого его операндов. Нет никакой связи между значением all_friends и будущими значениями friends_2017 и др. Если вы хотите, чтобы all_friends был актуальным, установите его после обновления соответствующего года.

1 голос
/ 07 ноября 2019

Эта строка:

all_friends = friends_2017 + friends_2018 + new_friends

создает новый список, который содержит копию всего, что есть в других трех списках на данный момент времени - это не ссылка на остальные три списка, поэтому, когда вывнести изменения в исходные три списка, эти изменения не применяются к all_friends.

. Причина, по которой all_friends является новым списком в этом случае, заключается в том, что оператор + создает новый список изего операндов. Если вы просто установите all_friends = new_friends, тогда all_friends будет просто ссылкой на существующий список new_friends, и все, что вы сделали с одним, повлияет на другой.


Способ, которым я бы порекомендовал сохранитьall_friends актуальным было бы сделать его функцией, которая вычисляет список по требованию, а не собственный список:

friends_2017 = ["Robert","John","Smith"]
friends_2018 = ["Andy","David","Tim"]
new_friends = []
def all_friends():
    return friends_2017 + friends_2018 + new_friends
print(str(all_friends()))

Теперь каждый раз, когда вы обращаетесь к all_friends() (обратите внимание на круглые скобки, потому что теперьэто вызов функции), он всегда будет иметь самые последние значения из этих трех списков.

Еще один вариант - перегенерировать all_friends при каждом добавлении в другие списки:

if year == "2017":
    friends_2017.append(add_friends)
elif year == "2018":
    friends_2018.append(add_friends)
else:
    new_friends.append(add_friends)
all_friends = friends_2017 + friends_2018 + new_friends

но это требует от вас помнить, чтобы делать это каждый раз, когда любой из этих списков изменяется. Если вы перейдете к методу использования функции, она будет просто магически работать каждый раз.

0 голосов
/ 07 ноября 2019

Давайте рассмотрим еще более простой пример:

friends_2017 = ["Robert","John","Smith"]
friends_2018 = ["Andy","David","Tim"]
new_friends = []
all_friends = friends_2017 + friends_2018 + new_friends
add_friends = input("Who do you want to add?")
friends_2017.append(add_friends)
print(friends_2017)
print(all_friends)

all_friends - это новый список, который создается путем объединения трех списков вместе. Затем вы добавляете в один из этих списков. Это не изменится all_friends, потому что это совершенно отдельный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...