Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 函数在函数外部更改变量(函数不返回)_Python 3.x - Fatal编程技术网

Python 3.x 函数在函数外部更改变量(函数不返回)

Python 3.x 函数在函数外部更改变量(函数不返回),python-3.x,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子句并直接返

首先,对于这个不伦不类的标题,我真的很抱歉,我不知道如何表达我的问题

鉴于以下代码:

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=[]

我认为,除非它是返回语句,否则在函数中更改或创建的任何变量都是函数的局部变量

例如,缔约国指出

在函数内部更改或创建的任何变量,如果没有声明为全局变量,则都是局部变量

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


谢谢

列表是可变的。当您将一个指针传递到函数中时,实际上是在传递一个指向列表的指针。最好将Python视为按引用传递,而不是按值传递。您正在更改的x不是在作为参数传入的函数中创建的。您没有更改x(标签x指向的内存地址),而是更改该内存地址的内容。
看到这个答案了吗?

你从来没有在函数(
x=…
)中创建过
x
),所以
x.pop()
变异了全局
x
。但是我却在改变x?正如Geektsforgeks.org的引述所说。这不意味着它是本地的吗?引用是错误的。。。突变更改(在可变类型上),例如
x.pop()
不会创建本地
x
。赋值创建一个局部变量。