размер набора меняется, хотя он не должен Python - PullRequest
1 голос
/ 19 мая 2019
class Test:
    TheFlag = True
    StartNodeQuery = {1, 2, 3, 4, 5}

    def parsa(self):
        while self.TheFlag:
            SNQ = self.StartNodeQuery
            self.iterator(SNQ)

    def iterator(self, CurrentNodeQuery):

        #it prints {1, 2, 3, 4, 5}
        print(CurrentNodeQuery)


        if len(CurrentNodeQuery) < 100:
            b = len(CurrentNodeQuery) * 2
            c = len(CurrentNodeQuery) * 3
            self.StartNodeQuery.update({b, c})

            # it prints {1, 2, 3, 4, 5, 10, 15}
            print(CurrentNodeQuery)

        else:
            self.TheFlag = False

        assert 0

obj = Test()
obj.parsa()

как вы можете видеть, я намеренно завершил программу с утверждением 0. Основная проблема: Перед завершением функции переданные ей параметры изменяются!

как видите StartNodeQuery = {1, 2, 3, 4, 5} и SNQ = self.StartNodeQuery

так почему, когда я изменяю размер self.StartNodeQuery внутри функции до ее завершения, CurrentNodeQuery, которая является другой переменной с теми же значениями, что и self.StartNodeQuery (или SNQ), также изменяется, даже если мы не передать новый self.StartNodeQuery в CurrentNodeQuery?

Я надеюсь, вы понимаете мою проблему, если у вас есть решение, пожалуйста, помогите парню

1 Ответ

0 голосов
/ 19 мая 2019

Некоторые проблемы и предложения в вашем коде

  • Не смешивайте переменные класса и экземпляра.Вы используете переменные класса TheFlag и StartNodeQuery в качестве переменных экземпляра, поэтому сделайте их едиными

  • Используйте конструктор для создания экземпляров переменных экземпляра

  • Возможно, используйте exit(), чтобы сломать функцию

  • Вам необходимо явно скопировать набор для создания нового экземпляра через copy.copy .Присвоение SNQ = self.StartNodeQuery просто создает новую ссылку на переменную

Таким образом, фиксированный код может выглядеть как

from copy import copy

class Test:

    def __init__(self):

        # Made instance variables as class variables
        self.TheFlag = True
        self.StartNodeQuery = {1, 2, 3, 4, 5}

    def parsa(self):

        while self.TheFlag:
            SNQ = self.StartNodeQuery.copy()
            self.iterator(SNQ)


    def iterator(self, CurrentNodeQuery):

        #it prints {1, 2, 3, 4, 5}
        print(CurrentNodeQuery)


        if len(CurrentNodeQuery) < 100:
            b = len(CurrentNodeQuery) * 2
            c = len(CurrentNodeQuery) * 3
            self.StartNodeQuery.update({b, c})

            # it prints {1, 2, 3, 4, 5, 10, 15}
            print(CurrentNodeQuery)

        else:
            self.TheFlag = False

        #Use exit to break the function
        exit()

obj = Test()
obj.parsa()

И на выходе будет

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...