在您的
flip()
函数中(像任何函数一样),如其他答案所述,您返回
picture
,它是作为函数参数传递的图像,但在d()中定义......
这涉及到变量的范围问题,因此我邀请您再次查看我们在
这里进行的讨论。
在这里,您有两个选择(您将其混合了):
- 直接修改给定的参数
picture
- 创建一个
newPicture
,对其进行修改,最后返回它
关于第二个选项的详细信息:
重要的是,
picture
变量属于
d()
函数(d()是它的范围)。同时,
newPicture
变量属于
flip()
函数(flip()是它的范围)。因此,新图片的生命周期是flip()(即当您终止执行flip()函数并返回时,它被销毁)。除非您将其返回给d(),否则d()不知道这个新图片。
因此,简而言之(假设我们正在谈论第二个选项):
- 创建一个以
picture
为参数的函数(flip())
- 在flip()内部,创建一个本地变量
newPicture
,仅修改该变量,以使原始
picture
保持不变
- 将新更新的
newPicture
返回给父级
scope
。这里d()调用flip(),所以它是父级范围。我们必须创建一个三维变量(属于d()的范围),以便掌握flip()返回的内容。
def flip(picture)
setColor(newPicture, ...)
...
return newPicture
def d():
file = PickAFile()
original_pic = makePicture(file)
finalNewPicture = flip(original_pic)
show(finalNewPicture)
{1}: 在这里,我们将flip(即newPicture
)返回的值赋给了更高作用域的变量finalNewPicture
(处理程序)...
我希望这能帮助你理解其背后的逻辑。就像俄罗斯套娃一样:newPicture在flip()中使用,在d()中使用...
编辑:
我还想解释第一种选项...
1) 创建一个以picture
为参数的函数(flip())
2) 在flip()中直接修改更高作用域的picture
变量
3) 不要从flip()返回任何内容
结果如下:
def flip(picture)
setColor(picture, ...)
...
def d():
file = PickAFile()
original_pic = makePicture(file)
flip(original_pic)
show(original_pic)
{1}: 在这里,flip() 直接在输入图片上进行了更改,因此我们可以直接显示原始的修改后的图片 (original_pic
)。不需要一个额外的处理变量。
选项 1 的代码:(已经为选项 2 工作,请参考)
def flip(picture):
height = getHeight(picture)
width = getWidth(picture)
x2=width-1
for x in range(0, width/2):
y2=0
for y in range(0, height):
pxl = getPixel(picture, x, y)
pxl2 = getPixel(picture, x2, y2)
color = getColor(pxl)
color2 = getColor(pxl2)
setColor(pxl2, color)
setColor(pxl, color2)
y2=y2+1
x2=x2-1
def d():
f = pickAFile()
original_picture = makePicture(f)
flip2(original_picture)
show(original_picture)
d()
请注意:flip可以被大大简化如下:
def flip2(picture):
height = getHeight(picture)
width = getWidth(picture)
for x in range(0, width/2):
for y in range(0, height):
pxl = getPixel(picture, x, y)
pxl2 = getPixel(picture, width-1-x, y)
color = getColor(pxl)
color2 = getColor(pxl2)
setColor(pxl2, color)
setColor(pxl, color2)