为什么这个 python 列表似乎是“按值”传递的?[复制]

Why did this python list appear to get passed "by value"? [duplicate]

提问人:Kanika 提问时间:7/8/2023 最后编辑:Karl KnechtelKanika 更新时间:7/12/2023 访问量:569

问:

我定义了以下函数:

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_varmyFunction()ida_list_varaa_list_var

python 列表 函数 pass-by-reference pass-by-value

评论

1赞 Klaus D. 7/8/2023
事实并非如此。Python 参数是通过赋值传递的。这意味着您将获得对对象的引用,但在函数中重新分配变量不会影响外部命名空间。此外,您只需丢弃返回值即可。

答:

-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 参数的重复。但是,您没有将返回的列表分配给 。你可以试试这个:myFunctionaa_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'>