在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是。谢谢你提到这一点