首先对于不起眼的标题真的很抱歉,我不知道如何说出我的问题。
鉴于以下代码:
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]?
谢谢
答案 0 :(得分:1)
列表是可变的。当你将一个传递给函数时,你实际上是在传递一个指向列表的指针。将Python视为通过引用传递比通过值传递更好。您正在更改的x不会在作为参数传递的函数中创建。您没有更改x(标签x指向的内存地址),您正在更改该内存地址的内容。 请参阅此回答Python functions call by reference