关于堆栈溢出也有类似的问题,但是我找不到我的代码做错了什么。

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的更改?

最佳答案

这是变量的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)


注意:在这里,我使用了2个变量,分别称为newPic。 Jython解释器将它们视为两个不同的变量:


第一个属于功能(功能范围)
第二个属于主程序(也称为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时,它显然是面向对象的。



我希望我能说清楚。如果没有,请随时提出进一步的解释。

关于python - 在jython中复制图像时将更改保存到newPic,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17250924/

10-11 10:21