Python中向函数传递参数
大家好,我有个问题,想问一下关于把可变对象传递给函数的事。
我写了下面的代码,原本期待输出是 [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
下面是具体的情况。
- 你接收到一个参数(在这个例子中是一个列表),并把它命名为
a
。 - 你创建了一个新的列表,并把它命名为
n
。 - 你给你命名为
n
的列表又加上了一个名字a
。 - 这两个名字
a
和n
只在lala
这个函数内部有效,所以当函数结束时,它们就“失效”了。 - 你在函数里创建的这个列表现在没有名字了,Python会把它丢掉。
换句话说, a
不是一个可以放新列表的盒子。它只是你给接收到的列表起的一个名字。后来,你把这个名字重新指向了你也命名为 n
的列表。
还有人建议使用切片赋值 a[:] = n
,这样做是用列表中项目的引用,而不是列表本身。当你这样做时,名字 a
仍然指向同一个列表;它的内容只是被替换了。因为这是传入函数的同一个列表,所以在函数外部用其他名字指向它的地方会“看到”新的内容。