fbpx

Почему функция, принимающая список, изменяет свой аргумент и делает его равным результату

217 просмотра
0
0 Комментариев

Почему RGB в предпоследнем print равняется RGB255? Что не так?

def makeRGB(l):
    mtx = []
    for j in l:
        mtx.append(list(j))
    return mtx
 
 
def makeRGB255(mtx):
    for (i, mtxRow) in enumerate(mtx):
        for (j, mtxElem) in enumerate (mtxRow):
            mtx[i][j] = round(float(mtxElem)/255,3)
    return mtx
 
 
def main():
    r = [(0, 0, 0), (255, 130, 92), (93, 227, 169)]
 
    RGB = makeRGB(r)
    print (RGB)
    RGB255 = makeRGB255(RGB)
 
    print (RGB)
    print (RGB255)
 
 
if __name__ == '__main__':
    main()

Вывод:

[[0, 0, 0], [255, 130, 92], [93, 227, 169]]
[[0.0, 0.0, 0.0], [1.0, 0.51, 0.361], [0.365, 0.89, 0.663]]
[[0.0, 0.0, 0.0], [1.0, 0.51, 0.361], [0.365, 0.89, 0.663]]


Добавить комментарий

1 Ответы

Python Опубликовано 25.06.2019
0

У вас функция изменяет список, который ей был передан как аргумент и возвращает его же.

Питон никогда не копирует объекты, передаваемые в функцию при вызове. Список с именем RGB, при вызове makeRGB255() получает ещё одно имя mtx на время вызова функции (как b = a работает в Питоне). Поэтому RGB255 список не просто то же самое значение имеет (RGB == RGB255), более того это тот же список (RGB is RGB255) — один и тот же объект.

Чтобы избежать подобных ошибок, в Питоне многие функции следуют Command–query separation принципу: если функция изменяет ввод, то она должна вернуть None, если ввод не меняется, то новый объект возвращается. Типичный пример: L.sort() метод сортирует список по месту и ничего не возращает, new = sorted(L) функция не изменяет L список и возвращает новый new [отсортированный] список.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up