2024-05-29 09:33:40 发布
网友
当我在函数内部重新赋值时,它只在函数内部赋值。如果在函数外打印相同的变量,则它与未重新分配的变量相同
x = 5 #assigning x def sth(): x = 2 print(x) #output : 2 sth() #calling function print(x) #still output : 5
我想如果我调用函数,它会重新分配它,但它没有
我应该如何在函数内部重新分配,以便它也在外部重新分配
这是由于变量的作用域。您可以使用下面的代码来更改x的值
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关键字,就不能在函数中重新分配全局变量。但是,访问或修改全局变量是可以的
global
x = 5 def print_x(): print(x) print_x() # prints 5
当Python解释器在函数print_x中遇到x变量时,它首先在局部变量列表中查找它,然后在找不到它时,在全局变量列表中查找它并找到它的值,即5
print_x
如前所述,您可以修改全局变量,而无需执行任何特殊操作:
arr = [] def modify_arr(): arr.append(5) print(arr) # prints [5]
类似地,当Python解释器读取arr.append(5)时,它在局部变量列表中查找变量arr,没有找到它,然后搜索globals列表,找到它并调用它的append方法
arr.append(5)
arr
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 = 2
函数调用后,x保持不变
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,然后引发一个错误,因为它还没有被赋值。函数中变量赋值的存在使该变量成为局部变量
print(x)
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
这是由于变量的作用域。您可以使用下面的代码来更改
x
的值但这不是执行赋值的好方法,正如@ggorlen在注释中所建议的那样,请确保您的函数是pure/idempotent
在Python中,如果没有
global
关键字,就不能在函数中重新分配全局变量。但是,访问或修改全局变量是可以的访问全局变量
当Python解释器在函数
print_x
中遇到x
变量时,它首先在局部变量列表中查找它,然后在找不到它时,在全局变量列表中查找它并找到它的值,即5修改全局变量
如前所述,您可以修改全局变量,而无需执行任何特殊操作:
类似地,当Python解释器读取
arr.append(5)
时,它在局部变量列表中查找变量arr
,没有找到它,然后搜索globals列表,找到它并调用它的append
方法定义局部变量
当解释器看到
x = 2
时,它将一个名为x
的变量添加到值为2的局部变量列表中。然后当它遇到x
在函数内部打印时,就像以前一样,它首先在局部变量列表中查找x
,因为它找到了它,只打印出2。它从来没有进入寻找全局x
的步骤,因为它首先找到了一个本地的函数调用后,
x
保持不变不使用global关键字重新分配和访问全局
在这里,我必须纠正我在上一节中给出的一个解释,这个解释并不是全部。我说“当解释器看到
x = 2
时,它会在局部变量列表中添加一个名为x
的变量”。但是如果这是真的,这个函数就不应该崩溃,它应该只打印全局x
,然后创建一个局部x
但是,实际情况是,所有局部变量名都是在函数运行之前标识的。所以它在局部变量列表中存储了一个变量
x
,但是它还没有被赋值。因此,当它到达print(x)
时,它会在局部变量列表中找到x
,然后引发一个错误,因为它还没有被赋值。函数中变量赋值的存在使该变量成为局部变量使用global关键字重新分配和访问全局文件(正确的方法)
这个
global
声明告诉解释器不应该将x
添加到局部变量列表中,即使它在函数中看到了x
的赋值。因此,所有更改都会更新globals列表中的x
相关问题 更多 >
编程相关推荐