我有以下代码:
def proc2(p):
p=p+[1]
y=[2,5]
proc2(y)
print(y)
z=[2,5]
z=z+[1]
print(z)
代码的输出是:
[2, 5]
[2, 5, 1]
我知道 y 没有修改为[2,5,1]
. 但是, y 被重新分配给一个新的 list,也就是[2,5,1]
,对吗?那为什么y还是指原始值呢?如果 z 的值发生了变化,为什么 y 没有变化?
PS我刚刚问了一个与这个几乎相同的问题。该问题已被标记为另一个问题的重复。但是,我认为它们有点不同。这就是为什么我再次发布我的问题。我想我一定错过了一些关于功能的东西。
y 被重新分配到一个新列表
不,y = ...
您的代码中只有一项作业。
当您的函数执行时会发生以下情况:
# implicitly: assign formal parameter name to actual argument value
p = y
# compute p + [1] => [2, 5, 1]
# assign the result to the name p
p = p + [1]
# aaaand... nothing from here on.
所以你的函数计算一个结果(一个新列表),p
在函数范围内分配名称,然后p
在函数退出时立即丢失。
如果您不想编写一个改变输入列表的函数,则需要返回计算值并重新分配名称y
以查看所需的效果。
>>> def proc2(p):
... p = p + [1]
... return p
...
>>> y = [2,5]
>>> y = proc2(y)
>>> y
[2, 5, 1]
请注意,即使您在函数内部进行了y = ...
赋值,该名称也将是该函数的本地名称,而外部作用域不会在意:
>>> def proc2(y):
... y = y + [1]
...
>>> y = [2,5]
>>> proc2(y)
>>> y
[2, 5]
最后,您可以告诉 Python 您的意思是y
函数体内的全局变量,但这被认为是糟糕的风格(在这里和大多数其他情况下)。
>>> def proc2():
... global y
... y = y + [1]
...
>>> y = [2,5]
>>> proc2()
>>> y
[2, 5, 1]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句