Python类属性与全局变量
我在一个类中定义了一个属性(yYEAR),并使用一个全局变量(YEAR)来初始化它。 当我在类中调用该方法时,它正在更新全局变量,即使我没有给它赋值。 为什么会这样?。 错误是对类变量定义的不正确位置执行某些操作Python类属性与全局变量,python,class,Python,Class,我在一个类中定义了一个属性(yYEAR),并使用一个全局变量(YEAR)来初始化它。 当我在类中调用该方法时,它正在更新全局变量,即使我没有给它赋值。 为什么会这样?。 错误是对类变量定义的不正确位置执行某些操作 JAN = MAR =MAY =JUL =AUG= OCT =DEC=[0]*31 APR=JUN=SEP=NOV=[0]*30 FEB=[0]*28 YEAR = [JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
JAN = MAR =MAY =JUL =AUG= OCT =DEC=[0]*31
APR=JUN=SEP=NOV=[0]*30
FEB=[0]*28
YEAR = [JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC]
class load:
yYEAR=YEAR
def __init__(self, DURATION, LTYPE):
self.DURATION=DURATION
self.LTYPE= LTYPE
def daily247(self):
if self.LTYPE==1 :
for month in range(len(self.yYEAR)):
for day in range(len(self.yYEAR[month])):
self.yYEAR[month][day]= 1
else:
self.yYEAR= YEAR
self.dispLoad()
def dispLoad(self):
print(self.yYEAR[0])
print(self.yYEAR[1])
event1= load(10,1)
event1.daily247() # Expected result ones in all nested elements in YEAR
event2= load(10,0)
event2.daily247() # Expected result zeros in all nested elements in YEAR
print(YEAR[1]) # expected result is to have zeros for all elements
您的
年份
是列表类型。Python的列表是可变的。在所有大写字母中拼写它意味着它一经设置(一个“常量”)就不应更改,但这只是Python根本不强制执行的约定
如果您想要一个可以更改的单独副本,而不是对全局文件的引用,请执行yYEAR=YEAR[:]
。那么副本将属于该类
[:]
是一种切片表示法,它只复制整个内容,因为您没有指定边界yYEAR=YEAR.copy()
也可以,但前者在列表中更为常规
如果需要每个实例的副本,请在\uuuu init\uuu
中设置属性,例如self.yYEAR=YEAR[:]
。真的,你可以把它拼成self.year
。那会更像蟒蛇
通过使用不可变元组而不是列表,您可以对常量进行更具防御性的编码,以防止意外突变。然后,您可以从中创建本地列表,如yYear=[*YEAR]
或者如果您仍然使用旧版本的Python,yYear=list(YEAR)
也可以工作。但要注意,不可变元组仍然可以包含可变元素,因此这也不能完全强制const正确性
还请注意,类似于
APR=JUN=SEP=NOV=[0]*30的语法意味着这四个月都将引用同一个列表对象。错误是由于提到的python可变列表“故障”。但是,使用[:]
或.copy()
复制列表在这种情况下不起作用,因为原始列表是二维的
制作2D列表的深度副本修复了该问题
import copy
并使用deepcopy()
谢谢你的见解。问题在于可变列表。但是“[:]”或.copy()在这种情况下也不起作用。我的原始帖子中的原始列表是一个2D列表。使用deepcopy()查看下面我的答案
class load:
def __init__(self, DURATION, LTYPE):
self.DURATION=DURATION
self.LTYPE= LTYPE
self.yYEAR = copy.deepcopy(YEAR)