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也将发生变化,CurrentNodeQuery是与self.StartNodeQuery(或SNQ)具有相同值的另一个变量。新self.StartNodeQuery到CurrentNodeQuery了吗?

希望您能理解我的问题,如果您有解决方案,请帮助一个人

最佳答案

代码中的一些问题和建议


不要混合类和实例变量。您正在使用类变量TheFlagStartNodeQuery作为实例变量,因此将它们设置为一个
使用构造函数实例化实例变量
也许使用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}

10-07 14:23