【发布时间】:2021-03-19 16:16:06
【问题描述】:
如果您使用ascii 将对象/列表转换为字符串,然后使用eval 转换回来,您将获得相同字节大小的相同表示。
为什么ast.literal_eval 回馈不同大小的对象?
a = [{"a": {"b": False}, True: 1}, 2, (3,6), ('g',),{"jfg"}]
b = ascii(a)
c = eval(b)
d = ast.literal_eval(b)
print(f"a: {sys.getsizeof(a)}\t{type(a)}\t{a}\nb: {sys.getsizeof(b)}\t{type(b)}\t{b}\nc: {sys.getsizeof(c)}\t{type(c)}\t{c}\nd: {sys.getsizeof(d)}\t{type(d)}\t{d}")
a: 96 <class 'list'> [{'a': {'b': False}, True: 1}, 2, (3, 6), ('g',), {'jfg'}]
b: 107 <class 'str'> [{'a': {'b': False}, True: 1}, 2, (3, 6), ('g',), {'jfg'}]
c: 96 <class 'list'> [{'a': {'b': False}, True: 1}, 2, (3, 6), ('g',), {'jfg'}]
d: 120 <class 'list'> [{'a': {'b': False}, True: 1}, 2, (3, 6), ('g',), {'jfg'}]
将对象转换为字符串并返回的更好/更安全/更快/更轻的方法是什么?
【问题讨论】:
-
列表的大小可能取决于用于创建它的特定函数,因为它会随着元素的添加而动态增长。
-
只需比较:
sys.getsizeof(eval('[13]'))和sys.getsizeof(ast.literal_eval('[13]')) -
@Barmar 你的意思是
literal_eval正在向列表中添加元素而eval没有? -
也许吧。您必须查看源代码才能准确了解它们的工作原理。
-
literal_eval()可能是用 Python 编写的,因此它会逐步构建列表,而eval()是一个内置函数,可以利用内部函数来创建具有指定大小的列表。跨度>
标签: python type-conversion ascii eval