通过引用突变python输入对象

时间:2019-03-24 23:57:09

标签: python python-3.x pass-by-reference

我遇到这样的合法情况,我需要实现一种方法来更改传入对象本身(将列表转换为字典)

def f(l): # f is a function that receives a list as input
    pass # Implement this


x = ['Hello', 'World']
f(x)
print(x) # x is now a dict {'hello':'world'}

您将如何实现上述f()

关键是调用f()时,传入的对象本身必须突变为其他类型。

注意:欢迎提供真实答案,而不是质疑情况。

2 个答案:

答案 0 :(得分:1)

Python无法执行所需的操作。您不能从函数内部更改调用上下文中变量的绑定。

当然,“不能”必须限定:Python具有许多自省功能,甚至可以让您检查调用堆栈以及调用帧中的全局变量和局部变量。但是我强烈建议不要这样做。

我知道您说过,您不想让人们质疑这一点的必要性,但是我不禁想到有更好的方法来解决问题。

答案 1 :(得分:0)

我认为这是不可能的,因为您可以在传递变量时对其进行修改并使其反映全局范围的变化,但是您不能更改其引用的对象。

def f(x):

    z = dict()
    for i in range(0,len(x),2):
        z[x[i]] = x[i+1]

    # x = z
    x.append(1)
    return x


x=[1,2]
z=f(x)
print(z) #[1, 2, 1]
print(x) #[1, 2, 1]

但是

def f(x):

    z = dict()
    for i in range(0,len(x),2):
        z[x[i]] = x[i+1]

    x = z
    return x


x=[1,2]
z=f(x)
print(z) #{1: 2}
print(x) #[1, 2]

Python允许您修改可变变量的全局范围,但不能更改引用本身。