函数更改函数外部的函数(函数未返回)

时间:2017-09-15 02:04:26

标签: python-3.x

首先对于不起眼的标题真的很抱歉,我不知道如何说出我的问题。

鉴于以下代码:

x = [9]
y = [2,4,6]

def f(x, y):
    if len(x) > 0:
        z = x + y
        x.pop(-1)
    return z.pop(0)

print(f(x,y)
print(f(x,y))

第二个打印行给我一个 UnboundLocalError:在分配前引用的局部变量'z'

我理解这个错误是什么,因为函数正在跳过if子句并直接返回z.pop(0),但z不存在,因为z在if子句中定义。

我想知道的是为什么x的值被函数改变了 该函数跳过if循环,因为在第一次调用之后,x已从x = [9]更改为x = []

我认为除非它是一个Return语句,否则在函数中更改或创建的任何变量都是函数的本地变量?

例如,geeksforgeeks.org表示

  

在函数内部更改或创建的任何变量都是本地的,如果它尚未声明为全局变量

那么为什么x的值在函数没有返回时会改变?不应该x的值总是[9]?

谢谢

1 个答案:

答案 0 :(得分:1)

列表是可变的。当你将一个传递给函数时,你实际上是在传递一个指向列表的指针。将Python视为通过引用传递比通过值传递更好。您正在更改的x不会在作为参数传递的函数中创建。您没有更改x(标签x指向的内存地址),您正在更改该内存地址的内容。 请参阅此回答Python functions call by reference