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

Yuh*_*ang 7 python function global-variables

首先,我理解我可以使用globalstatement来访问全局变量.但不知何故,我能够修改一个全局列表,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]
Run Code Online (Sandbox Code Playgroud)

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

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

nums = [1,2,3]
func3(nums)
print nums # print [4,5,6]
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

kin*_*all 9

我知道我可以使用全局语句来访问全局变量

你的理解是错误的.只要您没有同名的局部变量,就可以始终访问全局变量.global当您要更改变量名称引用的对象时,您只需要该语句.在你func2,你不是那样做的; 您只是在更改对象的内容.nums仍然指的是同一个清单.


NDe*_*vox 2

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

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

如果你对 s 尝试同样的事情,tuple它将不起作用,因为它们是不可变的

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

func2(list[:])
Run Code Online (Sandbox Code Playgroud)

同时,您可以使用默认参数来执行此操作,您可以将默认参数指定为[],然后如果您.append()对其进行某些操作,则该默认参数将永远在所有将来的调用中保留该项目(除非您在某种方式)。