Я не получаю желаемого результата с моим кодом 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