繁体   English   中英

Python变量分配:分配新值时更新先前的值

[英]Python variable assignment: previous value updated when new value assigned

我正在逐步处理一个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”。 打印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次迭代中,您很可能会看到两个值不同的数组:

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)

在循环结束时。

当您处理可变对象(如列表)时,请不要直接分配它,如下所示

>>> 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

如果我正确理解您要执行的操作,我建议简化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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM