python - 设置大小正在改变,即使它不应该 python

标签 python python-3.x set pycharm

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 吗?

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

最佳答案

代码中的一些问题和建议

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

关于python - 设置大小正在改变,即使它不应该 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56210765/

相关文章:

python - 无法弄清楚嵌套的 for 循环部分以及它在这段代码中是如何工作的

algorithm - 知道对顺序的一组元素的排序算法

python - make 不运行 .py 文件

python3 chdir() 似乎不起作用

python - cPickle 保存加载修改的对象 - Python

python-3.x - 如何在 Pandas 的数据框中转置值的子集?

c++ - 添加自定义比较器时无法插入要设置的新元素

optimization - 什么是快速查找集合列表的非空交集的数据结构?

python - Bloomberg APIv3 获取引用数据覆盖

python - 解码 sks (gpg) key 服务器数据库格式 (Python)