如何停止访问类变量而是访问实例变量?

问题描述

给定以下代码

class Gridspace:
    space = "e"

class GridRow:  
    space1 = Gridspace()
    space2 = Gridspace()
    space3 = Gridspace()
    space4 = Gridspace()
    space5 = Gridspace()
    space6 = Gridspace()
    space7 = Gridspace()
    space8 = Gridspace()
    space9 = Gridspace()
    space10 = Gridspace()
    spaceList = [space1,space2,space3,space4,space5,space6,space7,space8,space9,space10]

class Grid:    
    gridRow1 = GridRow()
    gridRow2 = GridRow()
    gridRow3 = GridRow()
    gridRow4 = GridRow()
    gridRow5 = GridRow()
    gridRow6 = GridRow()
    gridRow7 = GridRow()
    gridRow8 = GridRow()
    gridRow9 = GridRow()
    gridRow10 = GridRow()
    rowList = [gridRow1,gridRow2,gridRow3,gridRow4,gridRow5,gridRow6,gridRow7,gridRow8,gridRow9,gridRow10]

grid = Grid()

grid.rowList[0].spaceList[0].space = "s"

for x in grid.rowList:
    rowWord = ""
    for y in x.spaceList:
        rowWord = rowWord + y.space + " "
    print(rowWord)

我想输出一个 e 字符的 10x10 网格,除了左上角的应该是 s 字符的字符。相反,我正在更改每个行列表的第一个元素的类变量,而不是仅更改第一行列表的第一个元素的实例变量。如何使它只将第一个字符更改为 s,而将其他 99 个字符保留为 e?

解决方法

如果您希望变量成为实例变量,则必须如此定义它们(例如,在 __init__ 函数中使用 self 参数):

class GridSpace:
    def __init__(self):
        self.space = "e"

class GridRow: 
    def __init__(self):
        self.spaceList = [GridSpace() for i in range(10)]

class Grid:    
    def __init__(self):
        self.rowList = [GridRow() for i in range(10)]

PS:我使用了列表理解来简化代码。

,

发生这种情况是因为以下语句是 True

grid = Grid()
print(Grid.rowList[0].spaceList[0] is Grid.rowList[1].spaceList[0]) # outputs True

在这里您可以看到第一行的 spaceList[0] 与第二行的 spaceList[0] 完全相同(它们指的是同一个对象,当一个对象发生变化时,另一个也是如此)。

正如您已经猜到的那样,您需要将这些转换为实例变量。但是您必须执行此 2 级深度,这意味着您必须将其应用于 GridSpaceGridRow

class GridSpace:
    def __init__(self):
        self.space = "e" # Now "e" is unique to every column

以及

class GridRow:  
    def __init__(self):
        self.spaceList = [GridSpace() for _ in range(10)] 

现在语句 print(Grid.rowList[0].spaceList[0] is Grid.rowList[1].spaceList[0]) 确实是 False 并且您的代码运行良好

s e e e e e e e e e 
e e e e e e e e e e 
e e e e e e e e e e 
e e e e e e e e e e 
e e e e e e e e e e 
e e e e e e e e e e 
e e e e e e e e e e 
e e e e e e e e e e 
e e e e e e e e e e 
e e e e e e e e e e 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...