Эта строка является источником проблем:
solnSet.append(nums[0])
При добавлении к list
ничего не возвращается (поэтому по умолчанию возвращается None
). Когда ваша функция выполняет рекурсию для allSum(solnSet.append(nums[0]), nums[1:], target)
, , вы фактически передаете None
в первый аргумент .
Это вызовет исключение 'NoneType' object is not iterable
, когда ваш код запускает map(lambda x: tuple(x), solnSet)
или sum(solnSet)
.
Чтобы решить эту проблему, вы можете сделать
allSum(solnSet + [nums[0]], nums[1:], target)
(это создает новый список и не изменяет оригинал)
[1118 ] или
solnSet.append(nums[0])
allSum(solnSet, nums[1:], target)
(но этот действительно изменяет оригинал).
Плавание было бы моим выбором, но это действительно зависит от того, чего Вы хотите достигнуть. Если бы можно обеспечить более определенный пример, я смог бы привести Вам ясную причину относительно того, что и почему я думаю, что необходимо использовать. Однако вот краткий набор за и против, что я приехал через (я предполагаю, что путем расположения Вас означают абсолютное расположение):
Расположение профессионалов:
Расположение недостатков:
Профессионалы плавающие:
Недостатки плавающие:
Относительно clear:both элемента, который упомянул Sebastian, существует простой путь вокруг этого. Позволяет говорят, что у Вас есть контейнерное отделение и 2 пущенных в ход отделения внутри.
HTML:
<div id="con">
<div class="float"></div>
<div class="float"></div>
</div>
CSS:
#con { background:#f0f; }
.float { float:left; width:100px; height:100px; background:#0ff; }
если бы необходимо было выполнить этот код, то Вы заметили бы, что контейнерное отделение (пурпурного цвета) является только единственным пикселем высоко, тогда как пущенные в ход отделения были корректны - который является проблемой, которую упомянул Sebastian. Теперь Вы могли послушать его совет и добавить br или пустить в ход контейнер, который не будет очень семантическим - таким образом, вот будет немного более изящное решение. Просто добавьте overflow:hidden; контейнерному отделению как так:
#con { background:#f0f; overflow:hidden; }
Теперь Ваш контейнер должен перенести пущенные в ход отделения правильно.
Ну, если вас не слишком заботят старые браузеры (я смотрю на вас, IE6), то лучше путь здесь заключается в
display:inline-block;
. По сути, он создает элемент блочной модели без очистки до или после него, поэтому он остается в строке. Каждый современный браузер хорошо это интерпретирует.
Родительский контейнер не простирается с ними, если ему также не присваивают тег плавающий или существует br с clear:both; внизу.
Я пошел бы с float:left вместо расположения. Браузер делает все выравнивание, когда один объект простирается. Таким образом, существует меньше, чтобы Вы заботились о.
Я думаю, что явно не расположил бы элементы, а скорее дал бы браузеру команду использовать встроенное расположение для элементов с помощью display:inline и позволять браузеру обработать расположение.
относительно плавания по сравнению с расположением я думаю, что единственный способ выровнять их использующий расположение при помощи абсолютного расположения, и это означает, что необходимо обработать, изменяет размер (порта представления браузера) для удержания элементов на месте.
Я думаю, что при помощи свойства плавающего браузер обрабатывает проблемы изменения размеров для Вас и повторно представляет элемент в корректном месте.
Только недостаток для плавания в таких ситуациях для меня был то, что Вы или должны будете к левому выровнять по ширине их или право, выравнивают по ширине их - центрирование не является опцией. Однако Вы упомянули использование абсолютных значений для ширин таким образом, Вы могли просто вложить все пущенные в ход элементы в элементе DIV и добавить или граничное право или оставленный полю родительскому DIV моделировать выравнивание по центру.