繁体   English   中英

为什么我不能在 reversed() 函数之后将它返回给 str() 内置函数?

[英]Why can't I return it to the str() built-in function after the reversed() function?

a = '123asdad'


str(reversed(a))
>> '<reversed object at 0x00000206C9F80250>'


list(reversed(a))
>> ['d', 'a', 'd', 's', 'a', '3', '2', '1']

我已经知道最好的方法是 [::-1]。

但我想知道为什么我不能将反转的对象转换为 str() 函数。 list() 或 tuple() 是可能的,但为什么不是 str()?

这三个都是可迭代对象和 Seqence 类型对象,有什么我不知道的吗?

这三个都是可迭代对象和 Seqence 类型对象,有什么我不知道的吗?

你是对的,它们都是可迭代的对象,但是它们每个都有不同的__str__实现。

如果您希望str(reversed(a))返回"['d', 'a', 'd', 's', 'a', '3', '2', '1']" ,那么您必须要求reversed类具有与list相同的__str__行为。

这实际上会很混乱,因为它会模糊reversedlist对象之间的区别。 他们是故意不同的。 reversed对象包装了一个底层集合,并且表现得好像它已经反转了内存中的所有元素,而实际上并没有浪费 CPU/内存来反转内存中的所有元素。

如果您确实想要__str__list行为,请使用

str(list(reversed(a)))

当然,您应该注意到,这最终会进行所有真实的反转,将元素以相反的顺序复制到新列表中。 如果这是不可取的,那么你将不得不实现你自己的格式化代码来迭代一个reversed的对象(或任何可迭代的,真的),引用它的元素,用 连接它们,并用[ ]包围它们。

str调用对象上的__str__函数(这是在print对象时调用的函数,因此在 REPL 中str(reversed(a))reversed(a)的输出之间没有区别)。


如果既没有提供也没有提供__str__函数,则会自动生成__repr__函数。

你可以在这里看到这个:

class Foo:
    pass

my_obj = Foo()
print(my_obj)

输出: <__main__.Foo object at 0x7ffa890ab5e0>

reversed类没有提供__str__函数,所以str(reversed(a))会返回自动生成的值


使用''.join(reversed(a))获得所需的输出:

>>> a = '123asdad'
>>> ''.join(reversed(a))
'dadsa321'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM