在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的更改?
答案 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,它明显是面向对象的......
我希望自己清楚明白。如果没有,请不要犹豫,进一步解释。