我遇到这样的合法情况,我需要实现一种方法来更改传入对象本身(将列表转换为字典)
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()
时,传入的对象本身必须突变为其他类型。
注意:欢迎提供真实答案,而不是质疑情况。
答案 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允许您修改可变变量的全局范围,但不能更改引用本身。