Python中向函数传递参数

0 投票
6 回答
676 浏览
提问于 2025-04-16 08:19

大家好,我有个问题,想问一下关于把可变对象传递给函数的事。

我写了下面的代码,原本期待输出是 [0,0,0],结果却是 [0,1,2,3]。

这是不是意味着传给函数的参数其实是被复制了一份,然后再传进去的呢?

def lala(a):
    n = [0, 0 , 0]
    a = n

a = [0,1,2,3]

lala(a)

print a

如果我想在函数内部完成上面的任务,我该怎么优雅地写呢?

非常感谢!

6 个回答

2

你可以在函数里面用 a[:] = n 这个写法。这种写法叫做切片赋值。

3

我觉得kindall的解释很不错,但我更喜欢用一种方法,就是让函数直接返回结果,而不是去处理那些引用。

def lala():
     n = [0, 0, 0]
     return n

a = [0, 1, 2, 3]

a = lala()

print a # prints [0, 0, 0]
8

在理解Python的时候,可以把它想象成给对象贴上名字标签,而不是把对象放进有名字的盒子里。

def lala(a):
    n = [0, 0 , 0]
    a = n

下面是具体的情况。

  1. 你接收到一个参数(在这个例子中是一个列表),并把它命名为 a
  2. 你创建了一个新的列表,并把它命名为 n
  3. 你给你命名为 n 的列表又加上了一个名字 a
  4. 这两个名字 an 只在 lala 这个函数内部有效,所以当函数结束时,它们就“失效”了。
  5. 你在函数里创建的这个列表现在没有名字了,Python会把它丢掉。

换句话说, a 不是一个可以放新列表的盒子。它只是你给接收到的列表起的一个名字。后来,你把这个名字重新指向了你也命名为 n 的列表。

还有人建议使用切片赋值 a[:] = n,这样做是用列表中项目的引用,而不是列表本身。当你这样做时,名字 a 仍然指向同一个列表;它的内容只是被替换了。因为这是传入函数的同一个列表,所以在函数外部用其他名字指向它的地方会“看到”新的内容。

撰写回答