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 吗?
我希望你能理解我的问题,如果你有解决办法,请帮助一个人
最佳答案
代码中的一些问题和建议
不要混合类变量和实例变量。您正在使用类变量
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}
关于python - 设置大小正在改变,即使它不应该 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56210765/