在jython中复制图像时保存对newPic的更改

时间:2013-06-22 12:51:24

标签: python image copy jython jes

在Stack Overflow上有类似的问题,但我在代码中找不到我做错的事。

def copyPic():
  file=pickAFile()
  oldPic=makePicture(file)
  newPic=makeEmptyPicture(getWidth(oldPic),getHeight(oldPic))
  for y in range(0,getHeight(oldPic)):
    for x in range(0,getWidth(oldPic)):
      oldPixel=getPixel(oldPic,x,y)
      colour=getColor(oldPixel)
      newPixel=getPixel(newPic,x,y)
      setColor(newPixel,colour)
explore(newPic)

当我在函数外部使用explore(newPic)show(newPic)时,会给出一个空白的白色画布。

这是因为newPic没有保存吗?如何“保存”对newPic的更改?

1 个答案:

答案 0 :(得分:4)

这是变量scope的问题:

定义函数(此处为copyPic())时,此函数内创建的所有变量仅由函数“可见”。全球计划对其存在一无所知。

Python解释器按照编写顺序(顺序)读取代码。 由于newPic首先在函数中定义,它属于它,并在函数终止后被销毁。 这就是为什么之后你不能引用newPic的原因。 要解决此问题,您必须返回变量(关键字return),以便在调用copyPic()函数时可以从主程序中获取它。

您必须执行以下操作:

def copyPic():
  file=pickAFile()
  oldPic=makePicture(file)
  newPic=makeEmptyPicture(getWidth(oldPic),getHeight(oldPic))
  for y in range(0,getHeight(oldPic)):
    for x in range(0,getWidth(oldPic)):
      oldPixel=getPixel(oldPic,x,y)
      colour=getColor(oldPixel)
      newPixel=getPixel(newPic,y,x)
      setColor(newPixel,colour)

  return newPic      # HERE IS THE IMPORTANT THING

newPic = copyPic()   # Here we assign the returned value to a new variable
                     # which belong to the "global scope".
explore(newPic)

注意:在这里,我使用了两个名为newPic的变量。这些被Jython Interpreter视为两个不同的变量:

  • 第一个属于函数(函数范围)
  • 第二个属于主程序(也称为global范围)

因此上面的代码与此完全相同:

def copyPic():
  file=pickAFile()
  ...
  return newPic    

newPic_2 = copyPic()    # Here we store / assign the "newPic" returned by the 
                        # copy function into another variable "newPic_2" (which
                        # is a "global variable").
explore(newPic_2)



编辑:

所有这一切的替代方法是使用global关键字告诉解释器从全局范围中找到newPic

newPic = None           # First declare "newPic" globally.

def copyPic():
  global newPic         # Tell the function to refer to the global variable.
  ...
  #return newPic        # No need to return anything, the function is 
                        # modifying the right variable.

copyPic()
explore(newPic)

请注意,一般来说,一个人试图避免使用全局变量。总是有更好的设计,特别是Python,它明显是面向对象的......


我希望自己清楚明白。如果没有,请不要犹豫,进一步解释。