在python中访问对象列表的属性
我有一个对象列表,称为在python中访问对象列表的属性,python,python-3.x,Python,Python 3.x,我有一个对象列表,称为Bricks,我想检查列表中所有对象的属性。我试过: pos = [Brick.start_pos for Brick in self.brick_list] 创建所需属性的列表,即start\u pos,但它仅使用砖列表中最后一块砖的属性填充列表。我正在使用python 3.4。我需要为很多不同的属性做这些,这样理解对我来说才有意义 Brick类主要只是数据的持有者,定义如下: class Brick: def __init__(self, start_pos=
Bricks
,我想检查列表中所有对象的属性。我试过:
pos = [Brick.start_pos for Brick in self.brick_list]
创建所需属性的列表,即start\u pos
,但它仅使用砖列表中最后一块砖的属性填充列表。我正在使用python 3.4。我需要为很多不同的属性做这些,这样理解对我来说才有意义
Brick类主要只是数据的持有者,定义如下:
class Brick:
def __init__(self, start_pos=0, current_pos=0, variety=0, moveability=0,
neighbours=0, max_range=0, sides=0, rotation=0, length=0,
previous_pos =0):
self.start_pos = start_pos
self.current_pos = current_pos
self.moveability = moveability
self.variety = variety
self.neighbours = neighbours
self.max_range = max_range
self.sides = sides
self.rotation = rotation
self.length = length
self.previous_pos = previous_pos
使用两个非常简单的函数。列表似乎包含相同的Brick实例,重复n次(n是列表器的长度) 相反,您可能希望将列表构建为
hell.brick_list = [Brick() for _ in lister]
显然,您需要向构造函数传递所有必要的参数,否则最终将得到具有相同属性(默认值)的砖块
事实上,考虑到你的第二个评论
for i in range (len(lister)): hell.brick_list[i].start_pos = lister[i]
最好的选择是一次性创建和初始化列表
hell.brick_list = [Brick(start_pos=pos) for pos in lister]
列表中似乎包含相同的Brick实例,重复n次(n是列表器的长度) 相反,您可能希望将列表构建为
hell.brick_list = [Brick() for _ in lister]
显然,您需要向构造函数传递所有必要的参数,否则最终将得到具有相同属性(默认值)的砖块
事实上,考虑到你的第二个评论
for i in range (len(lister)): hell.brick_list[i].start_pos = lister[i]
最好的选择是一次性创建和初始化列表
hell.brick_list = [Brick(start_pos=pos) for pos in lister]
列表中似乎包含相同的Brick实例,重复n次(n是列表器的长度) 相反,您可能希望将列表构建为
hell.brick_list = [Brick() for _ in lister]
显然,您需要向构造函数传递所有必要的参数,否则最终将得到具有相同属性(默认值)的砖块
事实上,考虑到你的第二个评论
for i in range (len(lister)): hell.brick_list[i].start_pos = lister[i]
最好的选择是一次性创建和初始化列表
hell.brick_list = [Brick(start_pos=pos) for pos in lister]
列表中似乎包含相同的Brick实例,重复n次(n是列表器的长度) 相反,您可能希望将列表构建为
hell.brick_list = [Brick() for _ in lister]
显然,您需要向构造函数传递所有必要的参数,否则最终将得到具有相同属性(默认值)的砖块
事实上,考虑到你的第二个评论
for i in range (len(lister)): hell.brick_list[i].start_pos = lister[i]
最好的选择是一次性创建和初始化列表
hell.brick_list = [Brick(start_pos=pos) for pos in lister]
您如何定义类
Brick
?您是如何构建列表的?列表作为属性保存在另一个类中。它是由hell.brick_list=len(lister)*[brick()]构建的。您拥有的片段是一个100%正确的列表理解,它生成brick_列表中所有砖块的属性(只要访问该属性不会作为副作用修改列表)。如果它没有给你你想要的——问题可能是列表不是你认为的那样。你是如何构建self.brick\u list
?@Elwood168似乎列表包含相同的brick
实例,重复n次(n是lister
的长度)。你是如何定义类brick
?您是如何构建列表的?列表作为属性保存在另一个类中。它是由hell.brick_list=len(lister)*[brick()]构建的。您拥有的片段是一个100%正确的列表理解,它生成brick_列表中所有砖块的属性(只要访问该属性不会作为副作用修改列表)。如果它没有给你你想要的——问题可能是列表不是你认为的那样。你是如何构建self.brick\u list
?@Elwood168似乎列表包含相同的brick
实例,重复n次(n是lister
的长度)。你是如何定义类brick
?您是如何构建列表的?列表作为属性保存在另一个类中。它是由hell.brick_list=len(lister)*[brick()]构建的。您拥有的片段是一个100%正确的列表理解,它生成brick_列表中所有砖块的属性(只要访问该属性不会作为副作用修改列表)。如果它没有给你你想要的——问题可能是列表不是你认为的那样。你是如何构建self.brick\u list
?@Elwood168似乎列表包含相同的brick
实例,重复n次(n是lister
的长度)。你是如何定义类brick
?您是如何构建列表的?列表作为属性保存在另一个类中。它是由hell.brick_list=len(lister)*[brick()]构建的。您拥有的片段是一个100%正确的列表理解,它生成brick_列表中所有砖块的属性(只要访问该属性不会作为副作用修改列表)。如果它没有给你你想要的——问题可能是列表不是你认为的那样。你是如何构建self.brick\u list
?@Elwood168似乎列表包含相同的brick
实例,重复n次(n是lister
的长度)。值得注意的是,在第一次(非工作)版本,这意味着在范围(len(lister))中i的行中:hell.brick\u list[i].start\u pos=lister[i]
每次为start.pos
赋值时,它都会被赋值给相同brick
实例的所有副本,因为它们都是相同的对象。@Pynchia。谢谢你的解释,我不明白会发生什么。我用您建议的内容替换了这一行,所有内容立即生效,非常令人满意:)[Brick()]
将被计算,并生成一个包含单个对象实例的列表。然后将该列表乘以len(lister)
,生成一个包含相同元素的列表,但重复len(lister)
。只创建了一个砖块对象实例。@SiHa是。谢谢你提到这一点