设置大小正在更改,即使它不应该更改

2024-04-26 18:01:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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()

如您所见,我故意用assert 0结束程序。 主要问题是: 在函数完成之前,传递给它的参数会被更改

如你所见 StartNodeQuery={1,2,3,4,5}和 SNQ=self.StartNodeQuery

那么,为什么在函数完成之前更改self.StartNodeQuery内部的大小时,CurrentNodeQuery(与self.StartNodeQuery(或SNQ)具有相同值的另一个变量)也会更改,即使我们还没有将新的self.StartNodeQuery传递给CurrentNodeQuery

我希望你能理解我的问题,如果你有解决办法,请帮助一个人


Tags: testselfobjlendefitassertprints
1条回答
网友
1楼 · 发布于 2024-04-26 18:01:01

代码中的一些问题和建议

  • 不要混合使用类和实例变量。您正在使用类变量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}

相关问题 更多 >