如何复制类变量 - Python

时间:2015-12-09 19:06:04

标签: python python-2.7 python-3.x

我正在制作一款使用4x4电路板的游戏,我想检查一张卡是否已被按下。

为此,我使用两块板。一个将用于计算(我要复制的变量)和另一个将用于在游戏中显示(原始板称为状态)。

我有以下代码,我想复制TreasureHuntGrid的状态变量,并在同一个类的另一个函数中使用它。 它应该独立于复制的变量,因此状态变量的更改不会影响计算变量。

我认为我在这里的代码处理状态和计算变量,因为它是相同的。

我如何独立对待它们?

class TreasureHuntGrid(GridLayout):
    Finish.shuffle()
    status = ListProperty(Finish.board) #Return a random lists of lists with 1 and -1 
    calculations = status 
    def __init__(self, *args, **kwargs):
      super(TreasureHuntGrid, self).__init__(*args, **kwargs)

    def button_pressed(self, button):
        if self.calculations[row][column] != 2: #Check if it is pressed or not
            button.text = {-1: Finish.surrounded(row, column), 1: 'X'}[self.sta$
            button.background_color = colours[self.status[row][column]]
            self.calculations[row][column] = 2

2 个答案:

答案 0 :(得分:3)

Python中的所有内容都是命名空间。在类定义中定义status = ...时,类对象将获得一个新属性:TreasureHuntGrid.status。您希望将statuscalculations属性放入对象命名空间。为此,只需在self.status中定义self.calculations__init__()

def __init__(self, *args, **kwargs):
  super(TreasureHuntGrid, self).__init__(*args, **kwargs)
  status = ListProperty(Finish.board) #Return a random lists of lists with 1 and -1 
  calculations = status 

此外,请注意,Finish.shuffle()仅在导入模块时调用一次。如果这不符合您的意图,请将该行代码放入构造函数中。

您可能从Python确定self.status的含义的方式中产生了混淆。如果您正在阅读该字段,self.status将重定向到父命名空间,如果它未在对象的命名空间中定义:TreasureHuntGrid.status。如果您要分配给self.status但它不存在,则会创建它。要了解我的意思,您可能需要研究以下示例:

>>> class A:
...    a = 1
...
>>> print A.a
1
>>> obj = A()
>>> print obj.a
1
>>> obj.a = 2
>>> print A.a
1
>>> print obj.a
2

如果您使用的是Python 3,请在print

的参数周围加上括号

答案 1 :(得分:2)

也许你可以试试deepcopy,就像这样:

from copy import deepcopy

然后改变:

calculations = status

要:

calculation = deepcopy(status)