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会自动尝试匹配全局变量吗?
谢谢.
我知道我可以使用全局语句来访问全局变量
你的理解是错误的.只要您没有同名的局部变量,就可以始终访问全局变量.global当您要更改变量名称引用的对象时,您只需要该语句.在你func2,你不是那样做的; 您只是在更改对象的内容.nums仍然指的是同一个清单.
在这种特定情况下,这是因为lists 是可变的。
因此,将它们放在全局命名空间中,甚至通过函数传递,意味着它们将被更改,因为 Python 保存的是对可变对象的引用,而不是它的副本。
如果你对 s 尝试同样的事情,tuple它将不起作用,因为它们是不可变的。
避免这种情况的方法是向函数提供列表的副本,而不是列表本身:
func2(list[:])
Run Code Online (Sandbox Code Playgroud)
同时,您可以使用默认参数来执行此操作,您可以将默认参数指定为[],然后如果您.append()对其进行某些操作,则该默认参数将永远在所有将来的调用中保留该项目(除非您在某种方式)。