提问人:Kanika 提问时间:7/8/2023 最后编辑:Karl KnechtelKanika 更新时间:7/12/2023 访问量:569
为什么这个 python 列表似乎是“按值”传递的?[复制]
Why did this python list appear to get passed "by value"? [duplicate]
问:
我定义了以下函数:
def myFunction(a):
print(f'In function, initial a = {a}, {id(a)}, {type(a)}')
a = a*10
print(f'In function, final a = {a}, {id(a)}, {type(a)}')
return a
当我尝试这样称呼它时:
a_list_var = [3]
print(f'In main script, initial a_list_var = {a_list_var}, {id(a_list_var)}, {type(a_list_var)}')
myFunction(a_list_var)
print(f'In main script, final a_list_var = {a_list_var}, {id(a_list_var)}, {type(a_list_var)}')
我得到这个结果:
In main script, initial a_list_var = [3], 139940245107776, <class 'list'>
In function, initial a = [3], 139940245107776, <class 'list'>
In function, final a = [3, 3, 3, 3, 3, 3, 3, 3, 3, 3], 139940654735936, <class 'list'>
In main script, final a_list_var = [3], 139940245107776, <class 'list'>
据我了解,Python 中的函数参数是“通过引用”传递的。由于列表是可变对象,我希望在调用后就地更改。但在这种情况下,看 和 的 s,它似乎被“按值”传递了。为什么?a_list_var
myFunction()
id
a_list_var
a
a_list_var
答:
-1赞
gh0st
7/8/2023
#1
我是新手,也试图弄清楚,但如果我没有错(有人可以纠正我),
myFunction
正在创建一个局部变量并修改该局部变量的内容,并在函数窗口中返回它,但全局窗口中不存在这些变量。a
你能试试这样的事情吗:
a_list_var = myFunction(a_list_var)
print(f'In main script, final a_list_var = {a_list_var}, {id(a_list_var)}, {type(a_list_var)}')
我认为它应该解决你的问题吗?我现在无法使用计算机来尝试此操作,这可能是错误的。但这里的关键是要使按引用传递起作用,您必须就地修改参数。因为您实质上是在创建一个新的局部变量并将其指向参数,所以 myFunction(a_list_var) 的输出不会修改原始变量指向的任何内容。a_list_var
您也可以尝试将 myFunction 重新定义为:
def myFunction(a):
nonlocal a_list_var
a_list_var = a*10
在上面的示例中,我指定了 myFunction 来修改全局变量,以便它可以正常工作(因为它没有创建任何内容的本地实例)a_list_var
0赞
Dilophosaurus8
7/8/2023
#2
您的函数 , 返回 list 参数的重复。但是,您没有将返回的列表分配给 。你可以试试这个:myFunction
a
a_list_var
def myFunction(a):
print(f'In function, initial a = {a}, {id(a)}, {type(a)}')
a *= 10 # This is a short for "a = a * 10"
print(f'In function, final a = {a}, {id(a)}, {type(a)}')
return a
a_list_var = [3]
print(f'In main script, initial a_list_var = {a_list_var}, {id(a_list_var)}, {type(a_list_var)}')
a_list_var = myFunction(a_list_var)
print(f'In main script, final a_list_var = {a_list_var}, {id(a_list_var)}, {type(a_list_var)}')
我更改的是,我将返回的列表分配给列表,这会产生以下输出:a_list_var
In main script, initial a_list_var = [3], 22569753494784, <class 'list'>
In function, initial a = [3], 22569753494784, <class 'list'>
In function, final a = [3, 3, 3, 3, 3, 3, 3, 3, 3, 3], 22569752701824, <class 'list'>
In main script, final a_list_var = [3, 3, 3, 3, 3, 3, 3, 3, 3, 3], 22569752701824, <class 'list'>
评论