在下面的代码片段中使用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。在
布尔值是不可变的,因此只有一个
True
和一个False
。深度复制一个真False
返回一个真False
。对于独立的矩阵单元,您不需要独立的False
对象;分配给矩阵单元将使列表元素指向另一个对象,而不是覆盖旧对象和使用该对象的所有其他对象。在相关问题 更多 >
编程相关推荐