Изменение списка после копирования Python

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

--
COLOR
-
POINT COLOR
...

куда

COLOR = (R,G,B)
POINT = (X,Y)

Пример:

--
(255,0,4)
-
(0,0) (255,0,4)
(0,1) (255,0,4)
(0,2) (255,0,4)
(0,3) (255,0,4)
--
(32,32,12)
-
(1,0) (156,0,42)
(1,1) (156,0,42)
(1,2) (156,0,42)
(1,3) (156,0,42)

Я хочу сохранить всю эту информацию в разных классах, чтобы упростить обработку данных.

Вот мой код на питоне:

#!/usr/bin/env python3

import sys

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Color:
    def __init__(self, r, g, b):
        self.r = r
        self.g = g
        self.b = b

class Pixel:
    def __init__(self, point, color):
        self.point = point
        self.color = color

class Cluster:
    def __init__(self, meanColor, pixels):
        self.meanColor = meanColor
        self.pixels = pixels

def printCluster(cl):
    print("---------------")
    print("(" + str(cl.meanColor.r) + "," + str(cl.meanColor.g) + "," + str(cl.meanColor.b) + ")")
    print("I have " + str(len(pixels)) + " pixels.")
    for px in pixels:
        print("(" + str(px.point.x) + "," + str(px.point.y) + ") (" + str(px.color.r) + "," + str(px.color.g) + "," + str(px.color.b) + ")")

def printClusters(clusters):
    for cl in clusters:
        printCluster(cl)

def getColor(line):
    r = int(line.split(',')[0][1:])
    g = int(line.split(',')[1])
    b = int(line.split(',')[2][:-1])
    color = Color(r,g,b)
    return (color)


file = open(sys.argv[1], 'r')

meanColor = None
clusters = []
cluster = ""
pixels = []

import copy

count = 0
file.readline()
line = file.readline().rstrip('\n')
meanColor = getColor(line)
file.readline()
while True:
    count += 1
    line = file.readline().rstrip('\n')
    if (line == "--"):
        pixelsCopy = list(pixels)
        cluster = Cluster(meanColor, pixelsCopy)
        printClusters(clusters)
        printCluster(cluster)
        clusters.append(cluster)
        pixels = []
        printCluster(cluster)
        line = file.readline().rstrip('\n')
        meanColor = getColor(line)
        file.readline()
    elif (line and line != "--"):
        print("-------------------------------")
        printClusters(clusters)
        print("line: ~" + line + "~")
        x = int(line.split()[0].split(',')[0][1:])
        y = int(line.split()[0].split(',')[1][:-1])
        print("x: " + str(x))
        print("y: " + str(y))
        point = Point(x,y)
        r = int(line.split()[1].split(',')[0][1:])
        g = int(line.split()[1].split(',')[1])
        b = int(line.split()[1].split(',')[2][:-1])
        print("r: " + str(r))
        print("g: " + str(g))
        print("b: " + str(b))
        color = Color(r,g,b)
        pixels.append(Pixel(point, color))
    if not line:
        pixelsCopy = list(pixels)
        cluster = Cluster(meanColor, pixelsCopy)
        clusters.append(cluster)
        #printCluster(cluster)
        break

printClusters(clusters)

По какой-то причине после цикла while, когда я печатаю все объекты кластеров, я вижу, что все они содержат один и тот же список пикселей, я пытаюсь сделать копию с помощью deepcopy, с помощью [:] и с помощью list(), но это не имеет смысла. Я не знаю, в чем моя ошибка, также я печатаю кластер после сброса в [] и вижу, что он сохраняется как список ссылок, но я не знаю, почему, если я использую list() для создания копии.

Спасибо!

в printCluster(), for px in pixels: должно быть for px in cl.pixels. Голосование за закрытие как опечатка.

Mark Tolonen 08.05.2022 21:30
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужен атрибут экземпляра кластера с именем пиксели:

def printCluster(cl):
    print("---------------")
    print("(" + str(cl.meanColor.r) + "," + str(cl.meanColor.g) + "," + str(cl.meanColor.b) + ")")
    print("I have " + str(len(pixels)) + " pixels.")
    for px in cl.pixels:
        print("(" + str(px.point.x) + "," + str(px.point.y) + ") (" + str(px.color.r) + "," + str(px.color.g) + "," + str(px.color.b) + ")")

Укс! Грубая ошибка с моей стороны, большое спасибо!

Javier Sánchez Castro 08.05.2022 21:28

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