У меня есть цикл for с оператором if, проверяющим, равен ли текущий символ во «фразе» символу в «диктаторе [столбец]», и если да, то он добавит позицию символа в глобальный список «listY». но каждый раз, когда он пытается добавить значение «столбец» к «listY», он перезаписывает значение, которое было там ранее.
Это текущий код первой части кода, который находит X и Y символа в списке «encryptionTable»:
def findCypherP1():
a = 0 # length of phrase to encrypt (cypher phrase)
column = 0 # length of encryption section (shuffled alphabet)
row = 0
dictator = encryptionTable[0] # first row of the alphabet
for p in range(len(phrase) * len(dictator)):
global listY
listY = []
if phrase[a] == dictator[column]:
print("Column containing cypher Y:", str(column+1))
column2 = column
listY.append(column2)
a += 1; column = 0
if a >= len(phrase):
print(listY)
break
else:
column += 1
Что происходит, когда я запускаю код, он правильно возвращает значение X символов
Column containing cypher Y: 1
Column containing cypher Y: 11
Column containing cypher Y: 12
Column containing cypher Y: 19
Column containing cypher Y: 3
[2]
Но затем, когда он добавляет «столбец» к «listY», он перезаписывает предыдущее значение. Я попытался сделать копию int «столбец», но это работает только со списками. Если бы вы могли помочь решить эту проблему, было бы здорово! Спасибо!
Вы поделились функцией, но у вас нет примера значения глобальных переменных encryptionTable и phrase, к которым вы обращаетесь. Пожалуйста, поделитесь примерами или, что еще лучше, измените свою функцию, чтобы она принимала их в качестве аргументов, и покажите, как вы вызываете эту функцию.
Уберите listY = [] из цикла, если не хотите потерять старые значения.
Почему вы используете глобальную переменную? Сделайте это локальной переменной и верните ее в конце.
Это довольно просто потому, что вы повторно инициализируете listY=[] внутри своего цикла, верно? Если вы вытащите его из цикла for, он должен просто работать. Также в этом случае вам не нужна глобальная переменная?






Вы захотите перенести инициализацию вашей глобальной переменной listY за пределы цикла. Если listY находится внутри цикла, он будет повторно инициализировать listY при каждой итерации цикла. Кроме того, вам может не понадобиться глобальная переменная, и в этом случае вы можете просто вернуть listY из своей функции.
def findCypherP1():
listY = []
a = 0 # length of phrase to encrypt (cypher phrase)
column = 0 # length of encryption section (shuffled alphabet)
row = 0
dictator = encryptionTable[0] # first row of the alphabet
for p in range(len(phrase) * len(dictator)):
if phrase[a] == dictator[column]:
print("Column containing cypher Y:", str(column+1))
column2 = column
listY.append(column2)
a += 1; column = 0
if a >= len(phrase):
print(listY)
break
else:
column += 1
return listY
Я чувствую себя идиотом из-за того, что не осознаю, что инициализировал список в цикле, но спасибо!
На случай, если у вас возникнут проблемы с пониманием комментариев под вашим вопросом, необходимо внести изменения в код:
listY = []
def findCypherP1():
a = 0 # length of phrase to encrypt (cypher phrase)
column = 0 # length of encryption section (shuffled alphabet)
row = 0
dictator = encryptionTable[0] # first row of the alphabet
for p in range(len(phrase) * len(dictator)):
if phrase[a] == dictator[column]:
print("Column containing cypher Y:", str(column+1))
column2 = column
listY.append(column2)
a += 1; column = 0
if a >= len(phrase):
print(listY)
break
else:
column += 1
Непонятно, чего именно вы ожидали, но вы создаете новый список и присваиваете его глобальной переменной (у объектов нет области видимости, у переменных есть область видимости) на каждой итерации цикла,
listY = [].