как работает «список.добавить(val) или список»?

#python #python-3.x #list #append

Вопрос:

В поисках способа разрешить методу добавления списка() возвращать новый список, я наткнулся на это решение:
list.append(val) or list
Это действительно хорошо и подходит для моего варианта использования, но я хочу знать, как это делается.

Комментарии:

1. Хотите верьте, хотите нет, return list.append(val) or list но это больше кода (и, следовательно, медленнее), чем list.append(val); return list

2. Не делай этого, это повторение. list.append . всегда возвращается None . Вы пользуетесь этим фактом. Но просто используйте два отдельных утверждения.

3. Я вижу редкий случай, когда вы, возможно, захотите это сделать, скажем, глубоко вложенное выражение, в котором вам нужно добавить список до того, как произойдет одно, но после другого, но в этом случае само выражение, вероятно, должно быть разбито. В конце концов, Python-это не чисто функциональный язык. foo(bar(baz(), list.append(val) or list)) , например, может быть не то же самое , что list.append(val); foo(bar(baz(), list)) , так как изменяется порядок, в котором list.append и baz вызываются.

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

5. Просто сказать, что переписать его разумно может быть не так просто, как просто добавить одно дополнительное утверждение.

Ответ №1:

list.append(val) возвращает None , что является ложным, и поэтому запускает or и возвращает список. Тем не менее, я считаю это не питоническим, просто сделайте две отдельные строки без or

Комментарии:

1. Я согласен, что это не по-питонски, хотя и умно.

2. @j1-ли Я даже не понимаю, почему это умно.

3. таким образом, когда он переходит в оператор OR, список уже будет добавлен с val, и поскольку list не является «None», он возвращает список, потому что это «Истинное» утверждение?

4. @VlaryNottellu да точно, ты понял 🙂

5. @Chris_Rands черт возьми, это умно, я использую его в рекурсивной функции внутри оператора return, вот почему я хотел использовать этот случай.

Ответ №2:

list.append(val) возвращает None , что является ложным значением, поэтому значение всего выражения равно list . Если list.append бы возвращалось истинное значение, это было бы значением or выражения.

Ответ №3:

 x=[1] s=None print(x or s) #prints: [1]  

для любого дальнейшего использования, вот как это работает.
используя x.append(2) or x его, вы добавите значение, а затем при сравнении оно вернет истинное утверждение между этими двумя, которое является списком x=[1,2]