Когда переопределять переменную при использовании метода в Python? - PullRequest
0 голосов
/ 30 апреля 2020

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

Пример с набором stop_words и списком lst:

stop_words = stop_words.remove("whatever" ) # returns a variable of type none
stop_words.remove("whatever")  # has the desired effect of removing the word from the set
lst.append(2)  # doesn't update the list
lst = lst.append(2)  # updates the list.

По какой причине мне нужно переопределить переменную lst, когда я использую .append(), но не когда я хочу использовать .remove()

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

TL; DR - присваивать результат операции переменной, только если результат полезен для вас.

В присваивании python выражение справа от знака равенства выполняется полностью и разрешается в один анонимный объект до того, как левая часть будет оценена для назначения. Например, предположим, что я выполняю допустимую операцию с правой стороны, но недействительную с левой стороны. Правый аппенд работал еще до того, как python понял, что возникла проблема слева, и выдал исключение

>>> lst1 = []
>>> lst2 =[1]
>>> lst1[1] = lst2.append(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> lst1
[]
>>> lst2
[1, 2]

Аналогичным образом set.remove и list.append соответственно изменяют свои набор и список и вернуть нет. Они работают точно так же, независимо от того, что случится с None позже.

Оба ваших примера набора удаляют «все» из набора. Разница заключается в том, что в первом случае вы перепривязываете stop_words из набора к None. Если нет других ссылок на набор, он удаляется. То же самое со списком.

stop_words = stop_words.remove("whatever") 
stop_words.remove("whatever")

Это можно продемонстрировать, сохранив отдельную ссылку на объект для проверки

>>> test_set = {"whatever", "whatever 2"}
>>> stop_words = test_set
>>> stop_words = stop_words.remove("whatever")
>>> repr(stop_words)
'None'
>>> test_set
{'whatever 2'}
>>> stop_words = test_set
>>> stop_words.remove("whatever 2")
>>> stop_words
set()
>>> test_set
set()

То же самое происходит со списками

>>> test_list = []
>>> lst = test_list
>>> lst = lst.append(2)
>>> repr(lst)
'None'
>>> test_list
[2]
>>> lst = test_list
>>> lst.append(3)
>>> lst
[2, 3]
>>> test_list
[2, 3]
0 голосов
/ 30 апреля 2020

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

lst = [1, 2, 3]
print(f"Original list: {lst}")
lst.remove(1)
print(f"Updated: {lst}")
lst.append(4)
print(f"Updated: {lst}")

Вывод:

original list: [1, 2, 3]
Updated: [2, 3]
Updated: [2, 3, 4]

Методы будут возвращать значение None (его единственное назначение изменить список), поэтому переназначать его бессмысленно.

lst = [1, 2, 3]
lst = lst.remove(1)
print(lst)

Вывод:

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