我正在制作一款使用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
答案 0 :(得分:3)
Python中的所有内容都是命名空间。在类定义中定义status = ...
时,类对象将获得一个新属性:TreasureHuntGrid.status
。您希望将status
和calculations
属性放入对象命名空间。为此,只需在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)