首页 > 解决方案 > Python 2:在理解列表范围之外访问索引 i

问题描述

这个问题来自于遇到下面的代码,并没有理解到底发生了什么:当在 python 3 中运行时,它会产生一个错误,指出变量 i 未定义。但是在 python 2 中执行时,它运行平稳,甚至打印了 i 的值。

相关代码是这样的:

n_chi = pdbstruct.get_n_chi(res)

print 'n_chi'
print n_chi


rot_vels = [get_rot_vel_chi(res, i) for i in range(n_chi)]

for i_chi in reversed(range(n_chi)):

  # if chi angle has exceeded bounds, change direction
  # else keep same direction

  chi = pdbstruct.calculate_chi(res, i_chi)

  print "Show i"
  print i

  delta_chi = vector3d.normalize_angle(chi - mean_chi_values[i])

,我想提请注意和理解,在 python 2 中,此代码如何返回:

n_chi                                                                 
2                                                                     
Show i
1

但是,正如我所料,在 python 3 中它返回:

NameError: name 'i' is not defined

如果其中有什么我看不到的明显内容,请告诉我;但至少对我来说,python 2 设法运行似乎很奇怪,不知何故对 i 有一个值。

另请注意,i 的值不会改变,n_chi 的值也不会改变。


小编辑:

在我看来,由于 i 在理解列表中被调用并且 range 也被调用,所以值 i=1 来自 range(n_chi) 迭代的最后一个值。

那么,在 python 2 中,我是否以某种方式全局定义?

标签: listpython-2.7scopemigrationpython-3.7

解决方案


推荐阅读