Python中的列表、变量赋值和函数

2024-09-25 00:32:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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被重新分配到一个新的列表,即[2,5,1],对吗?那么为什么y仍然是指原值呢?如果z的值改变了,为什么y没有改变?

另外,我刚刚问了一个question,这个和这个差不多。那个问题被标记为另一个问题的重复。不过,我觉得他们有点不同。这就是为什么我再次发布我的问题。我想我一定错过了一些关于功能的东西。你知道吗


Tags: 代码标记功能列表defquestionprintproc2
3条回答

两种选择:

  1. 或者让函数返回新列表:

    def proc2(p):
        return p + [1]
    
  2. 或者,让它在适当的位置修改p(并且可以选择返回它以进行更干净的编码):

    def proc2(p):
        p += [1]  # this is not exactly the same as p = p + [1]
        return p  # <- optional!
    

您的代码没有修改现有的p,而是创建了一个新的,但是它不会与外部作用域通信;因此,当函数退出时,就会消失。你知道吗

变量y没有改变,因为变量p是函数的局部变量。函数结束后,此变量与y无关。你知道吗

y is reassigned to a new list

不,代码中只有一个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]

相关问题 更多 >