-2

我有一个函数,我在两台不同的机器上使用,一台是运行 Python 2.6 版的 Mac,另一台是运行 3.2 版的联想。该函数将数据写入文件并在循环中调用。使用 Python 3.2 时,它按预期工作,我得到如下输出

25.0    25.0    25.0    0
25.0    25.0    75.0    0
25.0    25.0    125.0   0
25.0    25.0    175.0   0
25.0    25.0    225.0   0
25.0    75.0    25.0    0
25.0    75.0    75.0    0
25.0    75.0    125.0   0
25.0    75.0    175.0   0
25.0    75.0    225.0   0

当我在运行 2.6 版的机器上运行它时,我得到了这个

175.0   25.0    75.0    2
175.0   25.0    125.0   0
25.0    25.0    25.0    0   Should be first line
175.0   25.0    175.0   0
25.0    25.0    75.0    0   Should be second line
175.0   25.0    225.0   0   
25.0    25.0    125.0   1
175.0   75.0    25.0    0
25.0    25.0    175.0   1
175.0   75.0    75.0    2

这是代码

def filesave(Xc,Yc,Zc,S): 
 Xc = str(Xc)
 Yc = str(Yc)
 Zc = str(Zc)
 Xs = str(S)
 #Ms = str(Ma)   
 w = open("Myout.txt.","a+")
 w.write(Xc)
 w.write('\t')
 w.write(Yc)
 w.write('\t')
 w.write(Zc)
 w.write('\t')
 w.write(Xs)
 w.write('\n')
 w.close()
 return()

导致差异的两个版本之间是否存在一些差异?谢谢!

编辑

其余代码

def cell_centers():
 read_file(F)
 dx = dy = dz= float(input('Please enter a value for dr:'))    #length of cell side 
 N  = int(input('Please enter a value for N:')) #N^3 Number of cells to be created
 Xc = zeros(N)       #array creation
 Yc = zeros(N)
 Zc = zeros(N)
 x1=0
 y1=0
 z1=0
 county = 0
 countz = 0

 for i in range(N):          #for loops to define cell centers
    Xc[i] = dx/2 +x1                  
    xmin = Xc[i]-dx/2
    xmax = Xc[i]+dx/2
    x1+=dx                   #increments x1 positions by dx
    for j in range(N):
      Yc[j] = dy/2 +y1
      ymin = Yc[j]-dy/2
      ymax = Yc[j]+dy/2
      county+=1
      if county==N:          #if else statement resets y1 to zero
        y1=0
        county=0
      else:
        y1+=dy
      for k in range(N):
         Zc[k] = dz/2 +z1
         countz+=1
         zmin = Zc[k]-dz/2
         zmax = Zc[k]+dz/2
         if countz==N:
          z1=0   
          countz=0
         else:
          z1+=dz
         counter(Xc[i],Yc[j],Zc[k],N,xmin,xmax,ymin,ymax,zmin,zmax,*read_file(F))

 return()        



def counter(Xc,Yc,Zc,N,xmin,xmax,ymin,ymax,zmin,zmax,Xa,Ya,Za):
 Cellcount = zeros(1)   
 S = (((xmin <= Xa) & (Xa <= xmax))& #count what is in specific range
     ((ymin <= Ya) & (Ya <= ymax))&
     ((zmin <= Za) & (Za <= zmax))).sum()

 for l in range(1):
   Cellcount[l]= S
 filesave(Xc,Yc,Zc,S)
 return()
4

2 回答 2

5

我要冒昧地说一下您所观察到的差异是由于版本 2.x 和 3.x 之间的划分发生了变化。(看起来有很多划分,我不知道数字是什么类型,整数或浮点数)

在 2.x 中,使用整数除法时会出现整数截断。这在 v 3.x 中不会发生

蟒蛇2

In [267]: 5 / 2
Out[267]: 2

蟒蛇 3:

In [1]: 5 / 2
Out[1]: 2.5

你的代码做了很多划分。

如果您仍然想要旧的整数除法行为,您可以使用//Python 3:

蟒蛇 3:

In [2]: 5 // 2
Out[2]: 2

更改除法运算符对此进行了详细说明。

Python 3.0 的新增功能涵盖了从 v 2 到 3 的重大变化

如果您想要 Python 2.2+ 中的除法行为,您可以使用from __future__ import division指令(感谢@Jeff 提醒我)。

蟒蛇2:

In [1]: 5 / 2
Out[1]: 2

In [2]: from __future__ import division

In [3]: 5 / 2
Out[3]: 2.5

更新

最后,请考虑划分的潜在问题作为一个原因(所以也许线条没有乱序,但结果是不同的,因为划分使它只出现这种方式)。那可能吗?另请注意,第 4 列(3.x 输出)全为零......这在 2.x 输出中不存在,并进一步指出了结果计算可能存在的问题——所以实际上结果是不同的而不是出局秩序。

于 2012-06-09T23:42:50.053 回答
2

你的filesave功能很好。我敢打赌,输出的差异是因为 Python 2 从整数除法表达式返回一个整数,而 Python 3 返回一个浮点数:

蟒蛇2

>>> 1/2
0
>>> 4/2
2

蟒蛇 3

>>> 1/2
0.5
>>> 4/2
2.0

这将在您的程序中给出不同的数学结果,并可能解释输出的不同顺序。

于 2012-06-09T23:43:38.113 回答