Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类属性与全局变量_Python_Class - Fatal编程技术网

Python类属性与全局变量

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

我在一个类中定义了一个属性(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]

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)