在您的flip()
函数中(就像在任何函数中一样),正如其他答案所提到的,您返回picture
的是作为函数参数传递但在 d()... 中定义的图像
这是scope
变量的问题,所以我邀请您再次查看我们在这里的讨论。
在这里,您有两个选择(您在两者之间进行了融合):
- 直接修改
picture
给定的参数
- 创建一个
newPicture
,修改它,最后返回它
有关 2d 选项的详细信息:
这里重要的是picture
变量属于d()
函数(d() 是它的作用域)。同时,newPicture
变量属于flip()
函数(flip() 是它的作用域)。所以newPicture 的生命周期是flip() (即一旦你终止flip() 函数的执行,它就会被销毁,同时返回)。并且 d() 对这个 newPicture 一无所知,除非你把它返回给 d()。
所以,简而言之(假设我们正在谈论第二个选项):
1)创建一个以 apicture
作为参数的函数 (flip())
2)在 flip() 内部,创建一个局部变量newPicture
并仅修改该变量,使原始变量picture
保持不变
3)将新更新的返回newPicture
给父级scope
。这里 d() 调用了 flip(),所以它是父作用域。我们必须创建一个 3d 变量(属于 d() 范围),以掌握 flip() 返回的内容:
def flip(picture)
# Create newPicture
# Modify newPicture (using the information from the "picture" parameter)
setColor(newPicture, ...)
...
return newPicture
def d():
file = PickAFile()
original_pic = makePicture(file)
finalNewPicture = flip(original_pic) # {1}
show(finalNewPicture)
{1}:这里我们将flip(ie newPicture
)返回的值赋给更高作用域的变量finalNewPicture
(handler)...
我希望它可以帮助您理解这背后的逻辑。就像俄罗斯娃娃一样:newPicture 用在 flip() 里面,它用在 d() 里面,...
编辑 :
我还想解释一下第一个选项...
1)创建一个以 apicture
作为参数的函数 (flip())
2)在flip()里面,直接修改higher scopedpicture
变量
3)不要从翻转()返回任何东西
这将导致:
def flip(picture)
# Simply modify the variable "picture", given as a parameter
setColor(picture, ...)
...
# Do not return anything
def d():
file = PickAFile()
original_pic = makePicture(file)
flip(original_pic) # {1}
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): # Only process the half way
y2=0
for y in range(0, height):
# swap pix and pix2
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()
注意:翻转可以被广泛简化如下:
def flip2(picture):
height = getHeight(picture)
width = getWidth(picture)
for x in range(0, width/2): # Only process the half way
for y in range(0, height):
# swap pix and pix2
pxl = getPixel(picture, x, y)
pxl2 = getPixel(picture, width-1-x, y)
color = getColor(pxl)
color2 = getColor(pxl2)
setColor(pxl2, color)
setColor(pxl, color2)