Я не получаю желаемого результата с моим кодом Python

      <code>def CheckNumber(MyList, number):
    counter=0
    while number!=0:
        for i,element in enumerate(MyList):
            if number%10==element:
                del MyList[i]
            else:
                continue
        number = number/10
    if len(MyList)==0:
        return 1
    else:
        return 2

print("Program to print all the possible combinations of a number")
MyNumber = int(input("Enter the number: "))
MyList = []
while MyNumber!=0:
    MyList.append(MyNumber%10)
    MyNumber=int(MyNumber/10)
MyLimit = 10**(len(MyList)-1)
for i in range(MyLimit, MyLimit*10):
    answer = CheckNumber(MyList, i)
    if answer == 1:
        print(i)
    else:
        continue`</code>

Я новичок в программировании, и я пытался написать код для печати всех возможных комбинаций числа. Если пользователь вводит трехзначное число, программа проверит все трехзначные числа, чтобы найти возможные комбинации, но вместо этого выдаст все числа в качестве вывода. Например, если пользователь вводит 12, вывод должен быть 12 21, но вместо этого отображаются все числа от 10 до 99.

Насколько я знаю, все работает нормально, но результаты не такие, как я ожидал.

1 ответ

Это проблема передачи по ссылке и передачи по значению. Это означает, что когда вы передаете список функции в python, вы не передаете значения в этом списке, вы передаете сам список или, скорее, его местоположение в памяти. Поэтому, когда вы изменяете MyList в своей функции CheckNumber, вы фактически изменяете переменную MyList глобально. Это неверно для примитивных типов, поэтому изменение числа не изменяет i в цикле for. Быстрый пример:

      def foo(my_list):
    my_list.append('world')
    print(my_list)

a = []
foo(a) # this will print out 'world'
print(a) # this will print out 'world'

b = 'hello'
foo(b.copy()) # This will print out 'hello world'
print(b) # Here we have not passed b directly into foo, 
# but instead passed a copy, so this will just print out 'hello' as b
# has not been modified

Подводя итог, переменные хранятся в определенном месте в памяти. Когда вы передаете по ссылке, вы передаете длинное это место в памяти, поэтому ваша переменная будет видоизменена. Если вы передаете по значению, ваша функция создаст новую переменную и сохранит копию данных, поэтому вы не будете изменять свою внешнюю переменную. В других языках вы можете указать, каким образом передавать переменную, но, на самом деле, вы не можете в python.

С учетом этого это очень легко исправить. Вы не хотите изменять исходный MyList, поэтому просто сделайте его копию и передайте ее в функцию. Вы также забыли преобразовать number/10 в int в функции CheckNumber. Рабочий код должен выглядеть так:

      def CheckNumber(MyList, number):
counter=0
while number!=0:
    for i,element in enumerate(MyList):
        if number%10==element:
            del MyList[i]
        else:
            continue
    number = int(number/10)
if len(MyList)==0:
    return 1
else:
    return 2

print("Program to print all the possible combinations of a number")
MyNumber = int(input("Enter the number: "))
MyList = []
while MyNumber!=0:
    MyList.append(MyNumber%10)
    MyNumber=int(MyNumber/10)
MyLimit = 10**(len(MyList)-1)
for i in range(MyLimit, MyLimit*10):
    answer = CheckNumber(MyList.copy(), i)
    if answer == 1:
        print(i)
    else:
        continue

Дополнительная информация о передаче по ссылке:

В чем разница между передачей по ссылке и передачей по значению?

https://blog.penjee.com/passing-by-value-vs-by-reference-java-graphical/

https://courses.washington.edu/css342/zander/css332/passby.html

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