变量赋值在函数中是如何工作的?

2024-05-29 09:33:40 发布

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

当我在函数内部重新赋值时,它只在函数内部赋值。如果在函数外打印相同的变量,则它与未重新分配的变量相同

x = 5      #assigning x

def sth():
    x = 2
    print(x)    #output : 2

sth()           #calling function
print(x)        #still output : 5

我想如果我调用函数,它会重新分配它,但它没有

我应该如何在函数内部重新分配,以便它也在外部重新分配


Tags: 函数outputdeffunctionprint调用函数赋值still
2条回答

这是由于变量的作用域。您可以使用下面的代码来更改x的值

x = 5      #assigning x

def sth():
    global x    
    x = 2
    print(x)    #output : 2

sth()           #calling function
print(x)        #output : 2

但这不是执行赋值的好方法,正如@ggorlen在注释中所建议的那样,请确保您的函数是pure/idempotent

在Python中,如果没有global关键字,就不能在函数中重新分配全局变量。但是,访问或修改全局变量是可以的

访问全局变量

x = 5

def print_x():
    print(x)

print_x()  # prints 5

当Python解释器在函数print_x中遇到x变量时,它首先在局部变量列表中查找它,然后在找不到它时,在全局变量列表中查找它并找到它的值,即5

修改全局变量

如前所述,您可以修改全局变量,而无需执行任何特殊操作:

arr = []

def modify_arr():
    arr.append(5)

print(arr)  # prints [5]

类似地,当Python解释器读取arr.append(5)时,它在局部变量列表中查找变量arr,没有找到它,然后搜索globals列表,找到它并调用它的append方法

定义局部变量

x = 5

def flawed_reassign_and_print_x():
    x = 2
    print(x)

flawed_reassign_and_print_x()  # prints 2
print(x)  # prints 5

当解释器看到x = 2时,它将一个名为x的变量添加到值为2的局部变量列表中。然后当它遇到x在函数内部打印时,就像以前一样,它首先在局部变量列表中查找x,因为它找到了它,只打印出2。它从来没有进入寻找全局x的步骤,因为它首先找到了一个本地的

函数调用后,x保持不变

不使用global关键字重新分配和访问全局

x = 5

def very_flawed_print_and_reassign_x():
    print(x)
    x = 2

very_flawed_print_and_reassign_x()  # raises an exception!

在这里,我必须纠正我在上一节中给出的一个解释,这个解释并不是全部。我说“当解释器看到x = 2时,它会在局部变量列表中添加一个名为x的变量”。但是如果这是真的,这个函数就不应该崩溃,它应该只打印全局x,然后创建一个局部x

但是,实际情况是,所有局部变量名都是在函数运行之前标识的。所以它在局部变量列表中存储了一个变量x,但是它还没有被赋值。因此,当它到达print(x)时,它会在局部变量列表中找到x,然后引发一个错误,因为它还没有被赋值。函数中变量赋值的存在使该变量成为局部变量

使用global关键字重新分配和访问全局文件(正确的方法)

x = 5

def change_and_print_x():
    global x

    x = 2
    print(x)

change_and_print_x()  # prints 2
print(x)  # prints 2

这个global声明告诉解释器不应该将x添加到局部变量列表中,即使它在函数中看到了x的赋值。因此,所有更改都会更新globals列表中的x

相关问题 更多 >

    热门问题