2017-07-31 114 views
-4
>>> 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'> 

为什么我不能追加到一个由json.loads在线返回dict,因为我可以用字典萨尔呢? 是不是json.loads只返回dict,这应该是任何其他字典相同?Python的追加到JSON字典在线

回答

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,被首先分配给2,其次7 STORE_NAME其中b然后分配到相同的值,2。

所以,用

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

sal接收值0。另外,当您调用json.loads时会创建一个临时变量,并且该变量被修改,之后参考将丢失。

为了使这个工作,你需要把它分成两部分,就像你已经完成的那样。

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

“python中的赋值从右到左发生”不太准确,因为'sal'实际上是在'json.loads(salaries)[“Hritik”]'之前赋值的。 Python赋值语句中的评估顺序比第一次出现时更加混乱。 – user2357112

+0

@ user2357112我在哪里可以看到这个? –

+1

https://docs.python.org/3/reference/simple_stmts.html#assignment-statements – user2357112

2

为什么我不能追加到一个由json.loads返回内联,因为我可以用字典SAL做字典?

你可以和你做,但是你只是丢弃该字典。它对salaries变量没有任何影响,并且您没有将该词典分配给sal。您分配0到sal

当您指定sal = json.loads(salaries)时,会创建与第一个字典无关的新字典,然后您实际将新字典赋予sal。当您通过sal查看字典时,对这个新字典的修改仍然可见。