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
。赋值创建一个局部变量。