Python变量赋值:在赋值

时间:2016-01-17 15:03:20

标签: python arrays

我有一个2D数组,我正在逐步从文本文件中输入(这说明我必须将数组中的每个值转换为浮点数)

  while 1:
e=path.find(", ")
#545.423, 169.830 536.723, 164.899 529.696, 160.916 520.343, 157.377 510.990, 153.839 510.298, 153.577
ptx=path[0:e]#545.423
path=path[e+2:]
e=path.find(" ")
if e>0:
  pty=0-float(path[0:e])
  pts.append([ptx,path[0:e]])

我想查找数组中两个连续值之间是否出现值:

  pta=[None]*2
  ptb=[None]*2
  y=None
  for pt in pts:
    if y==None:
      y=float(pt[1])
      continue
    if pta[0]==None:
      pta[0]=float(pt[0])
      pta[1]=float(pt[1])
      continue
    ptb[0]=float(pt[0])
    ptb[1]=float(pt[1])
    print pta[1],y,ptb[1]
    if (x>pta[0] and x<ptb[0])or(x<pta[0] and x>ptb[0]):
      .... some code ....
    pta=ptb

2D数组的第一个“y值”(它是[x,y]笛卡尔值的数组)被分配给'y',第二个点被分配给点'A'(pta),第三点到'B',然后点'B'被分配给点'A'而新的点被传递到点'B'。 print pta [1],y,ptb [1] 的输出如下:

-196.338 -126.302 -196.338
-187.437 -126.302 -187.437
-186.951 -126.302 -186.951
-178.351 -126.302 -178.351
-170.482 -126.302 -170.482
-164.385 -126.302 -164.385
-157.085 -126.302 -157.085
-150.623 -126.302 -150.623
-146.074 -126.302 -146.074
-140.465 -126.302 -140.465
-136.278 -126.302 -136.278
-133.244 -126.302 -133.244

不完全符合我的预期:pta [1]和ptb [1]值相同。我期待值pta [1]和ptb [1]不同。

-125.018 -126.302 -124.258
-124.258 -126.302 -124.007
-124.007 -126.302 -124.272
-124.272 -126.302 -125.045
-125.045 -126.302 -126.302

我需要在数组中找到'y'值落在2个数组条目之间的位置。

我正在将ptb传递给pta,但是当我将ptb的值更改为数组中的下一个pt时,它似乎也会改变pta?或者我的代码中有一些我看不到的愚蠢行?

3 个答案:

答案 0 :(得分:0)

在前3次迭代中,您很可能会看到两个数组具有不同的值:

print pta[1],y,ptb[1]

None, 1, None  # 0
3, 1, None  # 1
3, 1, 6   # 2
4, 1, 4  # on third iteration pta is the same lst as ptb

在第三次迭代中,您设置了pta=ptb - 它们不再像您希望的那样明显lists。确保你做到了

pta=list(ptb)

在循环结束时。

答案 1 :(得分:0)

当你处理像list这样的可变对象时,不要直接分配它,如下所示

>>> l = [1,2]
>>> b = l
>>> b
[1, 2]
>>> l.append(3)
>>> b
[1, 2, 3]
>>> id(l)
3072560332L
>>> id (b)
3072560332L # both referring to same object, only with different referencing names

一个人的变化可以反映在另一个人身上。 而是使用像

这样的东西
b = l[:]

将l复制到b,而不是访问同一个对象。现在两个人将分开ids

答案 2 :(得分:0)

如果我正确理解你要做的事情,我建议简化迭代和3个连续点的比较:

pts = [(0,0), (0,1), (0,4), (0,3), (0,2)]
for i in range(len(pts) - 2):
    ax, ay = pts[i]
    bx, by = pts[i + 1]
    cx, cy = pts[i + 2]
    b_between_a_and_c = ay < by < cy
    print("{} is between {} and {}: {}".format(by, ay, cy, b_between_a_and_c))

输出:

1 is between 0 and 4: True
4 is between 1 and 3: False
3 is between 4 and 2: False