Python附加到json dict inline

时间:2017-07-31 18:04:05

标签: python json python-3.x dictionary

>>> salaries = '{"Alfred" : 300, "Jane" : 400 }'
>>> sal = json.loads(salaries)["Hritik"]=0
>>> sal
0
>>> sal = json.loads(salaries)
>>> sal["Hritik"]=0
>>> sal
{'Alfred': 300, 'Jane': 400, 'Hritik': 0}
>>> type(json.loads(salaries))
<class 'dict'>
>>> type(sal)
<class 'dict'>

为什么我无法附加dict内联json.loads内联,因为我可以使用dict sal? 没有json.loads只返回dict并且应该与其他任何字典相同吗?

2 个答案:

答案 0 :(得分:3)

分配声明x = y = z表示xy都将采用z的值。

例如,查看赋值a = b = 2的字节代码:

In [45]: import dis; dis.dis(compile('a = b = 2', '', 'exec'))
  1           0 LOAD_CONST               0 (2)
              3 DUP_TOP
              4 STORE_NAME               0 (a)
              7 STORE_NAME               1 (b)
             10 LOAD_CONST               1 (None)
             13 RETURN_VALUE

使用4 STORE_NAME,首先将a指定为2,然后指定7 STORE_NAME,然后将b指定为相同的值,即为2。

所以,用

sal = json.loads(salaries)["Hritik"] = 0

sal收到值0。此外,当您调用json.loads并且已修改时会创建一个临时变量,之后会丢失该引用。

为了实现这一点,您需要将其分解为两部分,就像您已经完成的那样。

sal = json.loads(salaries)
sal['Hritik'] = 0

答案 1 :(得分:2)

  

为什么我无法附加json.loads内联返回的字典,因为我可以使用dict sal?

你可以,而且你这样做,但那时你就丢弃那个字典。它对salaries变量没有任何影响,并且您没有将字典分配给sal。您将0分配给sal

当您指定sal = json.loads(salaries)时,它会生成与第一个字典无关的新字典,然后您实际将新字典分配给sal。当您通过sal查看字典时,仍然可以看到对此新字典的修改。