gpt4 book ai didi

Python map 函数,通过引用/值传递?

转载 作者:太空狗 更新时间:2023-10-29 22:14:06 27 4
gpt4 key购买 nike

我对 Python 中的 map 函数有疑问。

据我所知,该函数不会改变它正在操作的列表,而是创建一个新列表并返回它。这是正确的吗?

此外,我还有以下一段代码

def reflect(p,dir):
if(dir == 'X'):
func = lambda (a,b) : (a * -1, b)
else:
func = lambda (a,b) : (a, b * -1)
p = map(func,p)
print 'got', p

points 是一个元组数组,例如:[(1, 1), (-1, 1), (-1, -1), (1, -1) ]

如果我以这样的方式调用上面的函数:

print points
reflect(points,'X')
print points

列表 points 不会改变。不过在函数内部,打印函数可以正确打印我想要的内容。

有人能给我指出一些方向,让我可以了解所有这些按值/引用传递等在 python 中是如何工作的,以及我如何解决上述问题?或者也许我太努力了,无法在 python 中模拟 Haskell...

谢谢

编辑:

说而不是 p = map(func,p) 我做

for i in range(len(p)):
p[i] = func(p[i])

列表的值在函数外更新,就像按引用工作一样。呃,希望这是清楚的 :S

最佳答案

您误解了引用在 Python 中的工作方式。在这里,所有名称都是引用,没有“值”。名称绑定(bind)到对象。但是 = 不会修改名称指向的对象——它将名称重新绑定(bind)到另一个对象:

x = 42
y = x
# now:
# 'is' is a identity operator — it checks whether two names point to the
# exact same object
print x is y # => True
print x, y # 42 42
y = 69
# now y has been rebound, but that does not change the '42' object, nor rebinds x
print x is y # => False
print x, y # 42 69

要修改对象本身,它需要是可变的——即公开改变它的成员或具有可修改的字典。当您重新绑定(bind) p 时会发生与上述相同的事情 — 它根本没有触及 points,它只是修改了本地 p 名称的含义.

如果你想模拟类C++的引用,你需要将对象封装到一个可变的容器中,例如一个列表。

reflect([points], 'X')

# inside reflect:
p[0] = ...

但您不应该这样做,至少在这种情况下 — 您应该只返回新对象。

points = reflect(points, 'X')

# inside reflect, instead of p = ...
return map(func, p)

嗯,既然我这么想,你也可以的

p[:] = map(func, p)

但同样,返回新对象通常更好。

关于Python map 函数,通过引用/值传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7203295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com