python 字符串和多处理,字典和列表管理器

ctzwtxfj  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(106)

我之所以写这个问题,是因为我所经历的似乎不应该是理想的行为:
下面的代码基本上是从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:如果你觉得有必要下投这个帖子,也请提供一个链接到我应该看到的答案。

unftdfkk

unftdfkk1#

f'{...=}'使用值的__repr__方法(而不是__str__方法)来打印值。
默认情况下,除非指定了格式,否则“=”将导致提供表达式的repr()
对于DictProxyListProxy对象,__str____repr__返回非常不同的字符串;对于list对象,list.__str__甚至没有定义,因此使用object.__str__(它只调用对象的__repr__方法)。
考虑:

class A:
    def __str__(self):
        return "string"
    def __repr__(self):
        return "repr"

a = A()
print(a)  # outputs string, as print calls str() on each argument
assert f'{a}' == "string"  # uses a.__str__()
assert f'{a=}' == "a=repr"  # uses a.__repr__()
assert f'{a=!s}' == "a=string"  # !s forces use of __str__

相关问题