Python打印City对象列表显示内存地址而非自定义内容的原因
问题
我在Python中编写了如下代码,定义了City类并实现了__str__方法,将多个City对象存入列表后打印该列表,结果仅显示类似<__main__.City object at 0x7faaa3c17340>的内存地址信息,而非我期望的自定义对象内容,请问这是什么原因?
cityNames = ['Detroit', 'Ann Arbor', 'Pittsburgh'] populations = [680250, 117070, 304391] states = ['MI', 'MI', 'PA'] city_tuples = zip(cityNames, populations, states) print(city_tuples) class City: def __init__(self, n, p, s): self.name = n self.population = p self.state = s def __str__(self): return '{}, {}, (pop: {})'.format(self.name, self.state, self.population) cities = [] for city_tup in city_tuples: name, pop, state = city_tup city = City(name, pop, state) cities.append(city) print(cities)
输出结果:
[<main.City object at 0x7faaa3c17340>, <main.City object at 0x7faaa3c173a0>, <main.City object at 0x7faaa3c17400>]
原因
在Python中,直接打印列表时,会调用列表内每个元素的__repr__()方法,而非__str__()方法。你仅实现了__str__方法,它仅在直接打印单个对象(比如print(city))时生效;而列表打印依赖的__repr__方法,默认逻辑就是输出对象的类名和内存地址,所以会出现你看到的结果。
解决方法
方案一:实现__repr__方法
在City类中添加__repr__方法,可直接复用__str__的实现,或者自定义符合需求的对象表示字符串:
class City: def __init__(self, n, p, s): self.name = n self.population = p self.state = s def __str__(self): return '{}, {}, (pop: {})'.format(self.name, self.state, self.population) def __repr__(self): return self.__str__() # 复用__str__的输出内容
修改后直接打印列表,就能显示自定义的对象内容。
方案二:遍历列表逐个打印
如果不想修改类定义,可以遍历cities列表,逐个打印每个City对象:
for city in cities: print(city)
也可以用join将所有对象转为字符串后批量打印:
print('\n'.join(str(city) for city in cities))
内容的提问来源于stack exchange,提问作者Haoshean Liew
相关产品推荐
相关产品推荐

