为什么返回的地址而不是值?

时间:2018-05-22 05:12:53

标签: python python-3.x

所以我写了一个代码,用于在python 3.5中返回维度(5,3,3,3)的对象列表。现在我的问题是,每当我尝试打印返回的值时,它会打印5个单独的3D列表的地址而不是整个列表。甚至返回值的类型也显示为list。究竟是什么问题?

这是我的初始化和返回功能。

class layer(object):

def __init__(self, inputDimensions, channels, padding, stride, layerInput):
    self.inputDimensions = inputDimensions
    self.channels = channels
    self.padding = padding
    self.stride = stride
    self.layerInput = layerInput

def getLayerInfo(self):
    return self.inputDimensions, self.channels, self.padding, self.stride

def getLayerInput(self):
    return self.layerInput

def getLayerFilterInfo(self):
    return self.filterDimensions, self.numberOfFilters

def getLayerFilters(self):
    return self.filters

def initializeFilter(self, filterDimensions, numberOfFilters):
    self.filterDimensions = filterDimensions
    self.numberOfFilters = numberOfFilters
    self.filters = []
    for i in range(0, self.numberOfFilters):
        fil = filters(self.filterDimensions)
        self.filters.append(fil)

这是我的过滤器类。

class filters(object):

    def __init__(self, dimensions):
        self.dimensions = dimensions
        self.fil = np.random.random_sample(self.dimensions)

以下是输入和输出的示例。

In [11]: l.getLayerFilters()

Out[11]: 
[<__main__.filters at 0xb195a90>,
 <__main__.filters at 0xb1cb588>,
 <__main__.filters at 0xb1cb320>,
 <__main__.filters at 0xb1cb5c0>,
 <__main__.filters at 0xb1cbba8>]


In [12]: type(l.getLayerFilters())
Out[12]: list

2 个答案:

答案 0 :(得分:1)

简而言之:而不是这样做:

fil = filters(self.filterDimensions)
self.filters.append(fil)

如果你这样做,你可以达到你想要的效果:

fil = filters(self.filterDimensions)
self.filters += fil.fil

不确定,这取决于那些过滤器应该是什么以及您希望如何将它们放在一起并在结果中。然后,似乎可以完全摆脱filters类。

实际上,您正在创建filters类的实例,然后将它们附加到列表中。打印该列表时得到的是OP中预期和看到的对象列表。那些对象ofc并不表示自己是列表,它们都是具有默认字符串表示的通用对象,只显示对象“来自”的类和内存中的地址,以提醒您它确实是一个对象而不是一个类。为了让你的类知道它应该是某种类型的列表并使其表现如此,你可以像这样实现__repr__方法:

def __repr__(self):
    return "<Filters: {}>".format(self.fil)

将它放在filters课程中,任何print课程都应该显示其中的列表(或其表示)。仍然可以改进。

BTW:请考虑将您的课程重命名为Filters左右。上骆驼案是PEP8对班级的建议。

答案 1 :(得分:1)

  

我想知道如何返回数据成员

您需要访问它们

filters = l.getLayerFilters()
for f in filters:
    print(f.dimensions, f.fil)
  

每当我尝试打印返回的值时,它都会打印地址

你从未告诉Python它应该如何打印你的对象。只是因为那些字段在那里,它不会自动显示它们。

在尝试与评论中讨论时,您需要使用一个新函数覆盖该输出行为,该函数返回您的类的单个人类可读的 repr 表示

作为一个例子

class filters(object):

    def __init__(self, dimensions):
        self.dimensions = dimensions
        self.fil = np.random.random_sample(self.dimensions)

    def __repr__(self):
        return "dimensions: {}\nfil: {}".format(self.dimensions, self.fil)

现在,再试一次

更多阅读

https://stackoverflow.com/a/2626364/2308683

Understanding repr( ) function in Python