You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:30:33