【问题标题】:Why raw_input is taking value first?为什么 raw_input 首先取值?
【发布时间】:2017-10-03 09:08:47
【问题描述】:
stu_dict = [{raw_input():int(raw_input())} for i in xrange(1)] 
print stu_dict

对于上面的代码,输入应该如下: 4r 打印为[{'r': 4}],这意味着它以4 作为值,r 作为键!

但是对于下面的代码,它是相反的,第一个输入将分配给键,第二个输入将分配给值

a = [[raw_input(), float(raw_input())] for i in xrange(int(raw_input()))] 
print a

为什么会这样?

【问题讨论】:

  • 在从左到右评估 dictlists 中的键之前评估值
  • @Chris_Rands 不。不在 Python >= 3.5 中。根据规范,键应该在值之前评估,但是有一个突出的错误:bugs.python.org/issue11205
  • @juanpa.arrivillaga 他们正在使用 2.7
  • @Chris_Rands 对,它是 2.7 中的一个 bug。根据规范,它应该是从左到右的。
  • @juanpa.arrivillaga 我最初在 dict 文字和理解语法之间混淆了,其中值在键之前评估,即使在 Python 3 中也是如此,例如{input(): input() for i in range(1)}

标签: python python-2.7 list-comprehension


【解决方案1】:

它出现在 Python 2 中,对于每个键/数据对,首先评估数据,然后从左到右评估对的序列(如果有的话)。

但是,在 Python>=3.5 中并非如此,在该版本中修复了错误并首先评估了键。

您可以通过从 2 元组序列构建 dict 来强制执行预期的行为:

[dict([(raw_input(), int(raw_input()))]) for i in xrange(1)] 

【讨论】:

  • 很乱。在旧的 Python 2 版本中,它“正常”工作(即根据规范),然后在 2.5 中引入了该错误。见this issue。我相信它在 3.3 和 3.4 中无法正常工作,但在 Python 3.5 中已修复
  • 列表推导的行为也不是人们对规范的期望,请参阅this question
【解决方案2】:

Python 从左到右计算表达式。请注意,在评估分配时,右侧会先于左侧进行评估。

这只是 Python 2.7 中的一个错误。

(在 Python3 中是相同的错误,但现在已经修复。)

【讨论】:

    猜你喜欢
    • 2016-10-04
    • 2019-05-30
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2019-09-25
    相关资源
    最近更新 更多