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