Python:修改函数内部的全局列表

2024-09-28 17:00:00 发布

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

首先,我知道可以使用global语句来访问全局变量。但不知何故,我可以修改一个全局列表,而不需要像下面这样global

def func1(nums):
    nums = [4,5,6]

nums = [1,2,3]
func1(nums)
print nums # print [1,2,3]

def func2(nums):
    nums[0] = 4
    nums[1] = 5
    nums[2] = 6

nums = [1,2,3]
func2(nums)
print nums # print [4,5,6]

在尝试func2之后,我意识到如果指定索引,我总是可以访问函数中的全局列表:

def func3(nums):
    nums[:] = [4,5,6]

nums = [1,2,3]
func3(nums)
print nums # print [4,5,6]

是因为如果在定义之前使用了函数变量,Python会自动尝试匹配全局变量吗?

谢谢。


Tags: 函数列表定义def语句全局globalprint
3条回答

在这种特殊情况下,这是因为lists是可变的。

因此,将它们放在全局名称空间中,或者甚至通过函数传递,意味着它们将被更改,因为Python保存对可变对象的引用,而不是其副本。

如果你用tuple尝试同样的方法,它将不起作用,因为它们是不可变的。

避免这种情况的方法是向函数提供列表的副本,而不是列表本身:

func2(list[:])

同时,您可以使用默认参数来实现这一点,在这里您可以将默认参数指定为[],如果您随后对其进行.append()操作,则该默认参数将永远保留该项,以供以后的所有调用使用(除非您以某种方式删除它)。

它的概念基于Python中的可变不可变对象。在您的情况下,例如:

a=[1,2]
def myfn():
    a=[3,4]
    print id(a)

>>>id(a)
3065250924L
>>>myfn()
3055359596

显然两者都是不同的对象。现在:

a=[1,2]
def myfn():
    a[:] =[3,4]
    print id(a)

>>>id(a)
3055358572
>>>myfn()
3055358572

这意味着它是在本地和全局范围内使用的相同变量。

I understand that I can use global statement to access global variables

你的理解错了。只要没有同名的局部变量,就始终可以访问全局变量。当要更改变量名所指的对象时,只需要global语句。在您的func2中,您没有这样做;您只是在更改对象的内容。nums仍然引用相同的列表。

相关问题 更多 >