Зачем доза Python List добавляет одно и то же?

У меня возникает вопрос, когда я использую list.append (). В следующем коде append () добавляет одно и то же n раз, почему это могло произойти?

ret=['aaa']
def generateMessage(num):
    ret[0]=num
    return (ret)

outputfile=[]
for cnt in range(0,5):
    # print(cnt)
    tmp=generateMessage(cnt)
    print("TMP is: ")
    print(tmp)
    outputfile.append(tmp)
    print("OutputFile is: ")
    print(outputfile)
print(outputfile)

На этом такой проблемы не будет:

ret=[]
def generateMessage(num):
    ret=num
    return (ret)

outputfile=[]
for cnt in range(0,5):
    # print(cnt)
    tmp=generateMessage(cnt)
    print("TMP is: ")
    print(tmp)
    outputfile.append(tmp)
    print("OutputFile is: ")
    print(outputfile)
print(outputfile)

Кто-нибудь может мне это объяснить? Большое спасибо!

Потому что, когда программа завершается, outputfile - это [ret, ret, ret, ret, ret], то есть [[5], [5], [5], [5], [5]].

Patrick Haugh 17.04.2018 16:22
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
46
1

Ответы 1

Следующее принимает ret, назначает свой первый элемент для num и возвращает ret:

ret=['aaa']
def generateMessage(num):
    ret[0]=num
    return (ret)

Все возвращенные списки - это один и тот же список. Вам нужно каждый раз возвращать новый список

def generateMessage(num):
    return [num]

Но возвращаемый список каждый раз имеет новое значение. Распечатав, я нахожу, что его значение: 0,1,2,3,4

walle 17.04.2018 16:36

Да, но проверьте, что tmp is ret - True. Это означает, что каждый добавленный элемент является одним и тем же списком.

Dan D. 17.04.2018 16:42

Спасибо, это потому, что когда я пишу ret=['aaa'], ret - это List object, а output меняется на ret

walle 18.04.2018 15:52

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