Это предназначенное поведение, поскольку i.pop()
- это выражение, которое оценивается до c.get(...)
. Представьте, что произойдет, если это не так. Вы могли бы иметь что-то вроде этого:
def myfunction(number):
print("Starting work")
# Do long, complicated setup
# Do long, complicated thing with number
myfunction(int('kkk'))
Когда у вас есть int('kkk')
быть оценены? Будет ли это, как только myfunction()
использует его (после параметров)? После этого, после долгой, сложной настройки, у него получится ValueError. Если вы скажете x = int('kkk')
, когда вы ожидаете ValueError? Сначала оценивается правая сторона, и значение ValueError происходит немедленно. x
не определяется.
Есть несколько возможных способов решения:
c.get(0) or i.pop()
Это вероятно, будет работать в большинстве случаев, но не будет работать, если c.get(0)
может возвращать значение Falsey, которое не None
. Более безопасный способ немного больше:
try:
result = c[0]
except IndexError:
result = i.pop()
Конечно, нам нравится ЭСПЦ (Легче попросить прощения, чем разрешения), но вы можете спросить разрешение:
c[0] if 0 in c else i.pop()
(Кредиты @soon)
Вот как работает интерпретатор питона, он первым оценил аргументы, которые вы передаются абоненту затем выполняет функцию. – Kasramvd