Почему при вычислении подмножеств массива кажется, что имена переменных имеют значение?

Я пытаюсь решить задачу собеседования по программированию, когда мне нужно сгенерировать подмножества массива. Скажем, массив [1,2,3]. Когда я использую:

def subsets(arr):
   def explore(arr, ans, temp, start, size):
      ans.append(temp[:])

      for i in range(start, size):
         #choose
         temp.append(arr[i])
         #explore
         explore(arr, ans, temp, start + 1, size)
         #undo
         temp.pop()
ans = []
size = len(arr)
explore(arr, ans, [], 0, size)
return ans

Я получаю: [[], [1], [1, 2], [1, 2, 3], [1, 3], [1, 3, 3], [2], [2, 2], [ 2, 2, 3], [2, 3], [2, 3, 3], [3], [3, 2], [3, 2, 3], [3, 3], [3, 3, 3]]

Однако, когда я использую i вместо start, вот так:

def subsets(arr):
def explore(arr, ans, temp, start, size):
    ans.append(temp[:])
    for i in range(start, size):
        #choose
        temp.append(arr[i])
        #explore
        explore(arr, ans, temp, i + 1, size)
        #undo
        temp.pop()
ans = []
size = len(arr)
explore(arr, ans, [], 0, size)
return ans

Я получаю правильный ответ: [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]] ".

Что здесь происходит? Я думал, что в результате разницы не будет, так как это всего лишь разница в именах переменных.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
28
2

Ответы 2

Вероятно, было бы намного проще использовать itertools ... если это не разрешено.

import itertools

stuff = [1, 2, 3]
for L in range(0, len(stuff)+1):
    for subset in itertools.combinations(stuff, L):
        print(subset)

Что касается вашего вопроса. i - это значение, увеличивающееся на каждой итерации вашего цикла, start - это значение i на первой итерации. Следовательно, они не взаимозаменяемы.

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

Другие вопросы по теме