关于堆栈溢出也有类似的问题,但是我找不到我的代码做错了什么。
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/