我之所以写这个问题,是因为我所经历的似乎不应该是理想的行为:
下面的代码基本上是从3.9.16 documentation on multiprocessing.Manager
from multiprocessing import Process, Manager
def f(d, l):
d[1] = '1'
d['2'] = 2
d[0.25] = None
l.reverse()
def multi_foo():
with Manager() as manager:
d = manager.dict()
l = manager.list(range(10))
jobs = []
for _ in range(1):
p = Process(target=f, args=(d, l))
jobs.append(p)
p.start()
for _j in jobs:
_j.join()
print(f"{d=}")
print(d)
print(f"{l=}")
print(l)
ell = l[:]
print(f"{ell=}")
if __name__ == '__main__':
multi_foo()
下面是运行上述代码生成的输出:
d=<DictProxy object, typeid 'dict' at 0x100cf2550>
{1: '1', '2': 2, 0.25: None}
l=<ListProxy object, typeid 'list' at 0x100f82790>
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
ell=[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
在我看来,第3行应该更像第5行。所以感觉不应该期待第1行和第3行上的f-string
输出。
我正在寻找一个解释,为什么我应该期望我在输出的第1行和第3行中得到什么。
ps:如果你觉得有必要下投这个帖子,也请提供一个链接到我应该看到的答案。
1条答案
按热度按时间unftdfkk1#
f'{...=}'
使用值的__repr__
方法(而不是__str__
方法)来打印值。默认情况下,除非指定了格式,否则“=”将导致提供表达式的
repr()
。对于
DictProxy
和ListProxy
对象,__str__
和__repr__
返回非常不同的字符串;对于list
对象,list.__str__
甚至没有定义,因此使用object.__str__
(它只调用对象的__repr__
方法)。考虑: