Python 打印列表中元素的字符串

Python 打印列表中元素的字符串,python,st,Python,St,我已经了解到,\uuu str\uu可以定义对象字符串的输出 例如: class Person(object): def __init__(self, name): self.name = name def __str__(self): return self.name p1 = Person('Steve Jobs') p2 = Person('Bill Gates') p3 = Person('Mark Zuckerberg') print

我已经了解到,
\uuu str\uu
可以定义对象字符串的输出

例如:

class Person(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name

p1 = Person('Steve Jobs')
p2 = Person('Bill Gates')
p3 = Person('Mark Zuckerberg')

print(p1)  # >>> Steve Jobs
它按照我的意愿输出了
SteveJobs
,而不是

但是,如果我创建一个列表:

lst = [p1, p2, p3]
print(lst)
# >>> [<__main__.Person object at 0x1045433c8>, <__main__.Person object at 0x1045434e0>, <__main__.Person object at 0x104543550>]
为了让它工作


这没有多大意义,对吧?

列表。\uuuu str\uuuu使用对象的
\uuu repr\uuu
来构建字符串。因此,只需将
\uuuuu repr\uuuuu
委托给
\uuuu str\uuuu

In [1]: class Person(object):
   ...:     def __init__(self, name):
   ...:         self.name = name
   ...:     def __str__(self):
   ...:         return self.name
   ...:     def __repr__(self):
   ...:         return str(self)
   ...:
   ...: p1 = Person('Steve Jobs')
   ...: p2 = Person('Bill Gates')
   ...: p3 = Person('Mark Zuckerberg')
   ...:

In [2]: print(p1)
Steve Jobs

In [3]: lst = [p1, p2, p3]
   ...:

In [4]: print(lst)
[Steve Jobs, Bill Gates, Mark Zuckerberg]
编辑

如果你想坚持传统,可以做以下事情:

In [18]: class Person(object):
    ...:     def __init__(self, name):
    ...:         self.name = name
    ...:     def __str__(self):
    ...:         return self.name
    ...:     def __repr__(self):
    ...:         return f"{type(self).__name__}({self.name})"
    ...:

In [19]: p1 = Person('Steve Jobs')

In [20]: print([p1])
[Person(Steve Jobs)]
考虑实施:

class Person(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name
    def __repr__(self):
        return 'Person({!r})'.format(self.name)  # !r adds the quotes correctly
其中:

>>> lst
[Person('Steve Jobs'), Person('Bill Gates'), Person('Mark Zuckerberg')]

您看到不匹配行为的原因是,
print
对其参数调用
str()
,但是
list
str
repr
是相同的,并且都对每个元素调用
repr

看这里是否有用-@AbhinavRisal it help。谢谢
str(i)
是拼写
i的一种更好的方法。\uuuu str\uuuu()
@Eric谢谢!我有点紧张,但是谢谢!谢谢据我所知,repr()是用python表示代码,以便
eval(repr(I))=I
。因此,对于任何python对象,
\uuuuu str\uuuuu==\uuuuu repr\uuuu
在启动时都是默认的吗?正确-从
\uuuuu repr\uu
输出原始名称违反约定。您可以输出
Person('stevejobs')
,这就是fine@Code_Control_jxie0755是的,通常你应该坚持这个惯例。因此,如果我通过执行
\uuuuuuuuuuuuuuuu repr\uuuu==\uuuuuuu str\uuuuuu
来更改
\uuuuu repr\uuuuuu
,这会导致
评估(repr(I))!=我
,并将在更大的范围内产生一些影响?请注意,
\uuuuuu str\uuuu=\uuuuu repr\uuuuu
已经是对象的默认值,因此您只需定义
\uuuu repr\uuuu
即可。“将在更大的范围内产生一些影响”-是的,由于输出变得模棱两可,您将使调试变得更困难-如果某人的名字是
“Hello,World”
?现在,您的姓名列表似乎有一个额外的姓名!
>>> lst
[Person('Steve Jobs'), Person('Bill Gates'), Person('Mark Zuckerberg')]