布尔对象的需要矩阵(列表列表)(用于与tkinter接口)

2024-05-03 04:54:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的代码片段中使用deepcopy来创建矩阵中的所有元素。运行时,输出显示所有“True”元素共享一个引用(内存位置),所有“False”元素共享另一个位置:

import copy

DefaultReports =  [ [ copy.deepcopy( False ) for column  in range( 0, 2 ) ]
                                                 for row in range( 0, 3 ) ]

#Some elements of the "matrix" (list of lists) must be set up differently

DefaultReports[ 0 ][ 0 ]  = True
DefaultReports[ 2 ][ 0 ]  = True

# The remaining code shows that all "True" elements share one location while 
# all "False" elements share another location:

print( "Initialized the ", len( DefaultReports ),"x", len( DefaultReports[ 0 ] ) , 
       " table as:" )
for row in range( len( DefaultReports ) ) :
    nextrow = []   
    for column in range( len( DefaultReports[ 0 ] ) ) :
        print( "(", row, ",", column ,  " @ ",        
                    id( DefaultReports[ row ][ column] ),                
                 ") = ", DefaultReports[ row ][ column],
               " ", sep ='', end = '' 
             )  
    print() 

# Initialize matrix used by rest of code (user can change all elements)

UserSelectedReports = DefaultReports 

# printing "UserSelectedReports" gives the same results as "DefaultReports" 

为了获得(在本例中是6个)可以使用[row][column]表单引用的单个元素,我缺少了什么?记住,在实际代码中,行和列索引是作为字符串列表提供的,有没有更好的(=简单)方法来获得矩阵效应?在

新增20140205:

很明显,布尔矩阵的初始化是什么样的。矩阵在类中用于跟踪Tkinter复选框数组的状态。这个类有几个实例化。简化了,我的问题是当一个复选框改变了状态(在任何实例化中),所有实例化中的所有复选框都会翻转状态。追查这个错误就把问题隔离到这个问题上。
在GUI上,这实际上导致只有两个按钮(在实例化之间共享!)-分为“初始正确”和“初始错误”两组(相互独立)。分组由初始化代码决定,在示例中,将两个元素设置为“True”,将四个元素设置为“False”显示分组效果。在

使用deepcopy(而不是“False”)的目的是强制Python创建(并初始化)一个布尔对象数组,而不是一个对True和False的引用数组。从我所读到的,deepcopy应该能够做到这一点(或者也许真与假都不被认为是对象?)在

当矩阵被实现为向量时,类可以正常工作:matrix@(row,column)=vector@((row*row length)+column)。我现在需要一个处理列表列表的版本(或者其他允许[row][column]索引的结构,其中行和列索引是字符串)。改编示例:

^{pr2}$

列表在初始化后从未更改过,也许numpy或OrderDict可以给我我想要的东西?(顺便说一句,在ADA中,所有这些都可以通过使用枚举类型轻松完成)希望我不必使用“PyObject*PyBool_FromLong(long v)”—按照http://docs.python.org/3.2/c-api/bool.html创建每个布尔对象。在

新增20140207

总之,需要几个布尔对象的矩阵,创建它们是问题所在。这些矩阵将GUI代码与程序的其余部分分离(每个矩阵都跟踪它自己对应的tkinter复选框矩阵的状态)。如果没有这些矩阵,tkinter BoolVar/IntVar对象将不得不在整个程序中使用,这会使逻辑复杂化,并在非GUI代码中引入GUI依赖关系,这绝不是一个好主意,因为这样做很难在以后更改GUI。在


Tags: 对象代码infalsetrue元素forrange
1条回答
网友
1楼 · 发布于 2024-05-03 04:54:38

布尔值是不可变的,因此只有一个True和一个False。深度复制一个真False返回一个真False。对于独立的矩阵单元,您不需要独立的False对象;分配给矩阵单元将使列表元素指向另一个对象,而不是覆盖旧对象和使用该对象的所有其他对象。在

相关问题 更多 >