【问题标题】:Python append to json dict inlinePython追加到json dict内联
【发布时间】:2017-07-31 18:04:05
【问题描述】:
>>> 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 sal 那样附加到 json.loads 返回的 dict 内联? json.loads 不只返回一个 dict 并且应该与任何其他 dict 相同?

【问题讨论】:

    标签: python json python-3.x dictionary


    【解决方案1】:

    赋值语句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
    

    【讨论】:

    • “python 中的赋值从右到左发生”不是很准确,因为 sal 实际上在 json.loads(salaries)["Hritik"] 之前被赋值。 Python 赋值语句中的求值顺序比最初看起来要混乱得多。
    • @user2357112 我在哪里可以找到这个?
    • 检查:import dis; dis.dis(compile('a=b=2', '', 'exec'))
    • @AshwiniChaudhary 谢谢!希望您不介意,将其添加到我的答案中。
    【解决方案2】:

    为什么我不能像使用 dict sal 那样附加到 json.loads inline 返回的 dict ?

    你可以,而且你确实做到了,但是你只是丢弃了那个 dict。它对salaries 变量没有任何影响,并且您没有将字典分配给sal。您将 0 分配给 sal

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      相关资源
      最近更新 更多