首先,我知道可以使用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会自动尝试匹配全局变量吗?
谢谢。
在这种特殊情况下,这是因为
list
s是可变的。因此,将它们放在全局名称空间中,或者甚至通过函数传递,意味着它们将被更改,因为Python保存对可变对象的引用,而不是其副本。
如果你用
tuple
尝试同样的方法,它将不起作用,因为它们是不可变的。避免这种情况的方法是向函数提供列表的副本,而不是列表本身:
同时,您可以使用默认参数来实现这一点,在这里您可以将默认参数指定为
[]
,如果您随后对其进行.append()
操作,则该默认参数将永远保留该项,以供以后的所有调用使用(除非您以某种方式删除它)。它的概念基于Python中的可变和不可变对象。在您的情况下,例如:
显然两者都是不同的对象。现在:
这意味着它是在本地和全局范围内使用的相同变量。
你的理解错了。只要没有同名的局部变量,就始终可以访问全局变量。当要更改变量名所指的对象时,只需要
global
语句。在您的func2
中,您没有这样做;您只是在更改对象的内容。nums
仍然引用相同的列表。相关问题 更多 >
编程相关推荐