当您在函数参数列表中定义变量时,python中的变量范围是什么?

时间:2018-04-10 04:29:00

标签: function variables scope python-2.x

最后,我得到了一个在stackoverflow上找不到的问题。

所以当我看到这种奇怪的行为时,我正在摆弄python和spark,并且无法弄清楚为什么它表现得那样?

这是我观察到的

当我写这样的函数时

>>> def add_to_q(n,q=[]):
...      q+=[n]
...      return q

>>> add_to_q(1)
[1]
>>> add_to_q(2)
[1,2]

这里变量" q"不再作为空列表启动,但每次调用该函数时都使用相同的队列引用。

但是当我试图用这样的变量来实现同样的目的时,

>>> def add_to_sum(n, sum=0)
...     sum += n
...     return sum

>>> add_to_sum(1)
1
>>> add_to_sum(5)
5

它应该返回6与前一个示例同步,但它没有。发生了什么?

ho python处理列表和变量有什​​么区别?

为什么这在列表中有用,而不是变量。 ?

提前感谢您的任何帮助或潜在客户。

2 个答案:

答案 0 :(得分:0)

列表是可变的,因此python可以在每次调用函数时在列表中进行更改。因此,更改将被转移。
但是整数不是可变的,因此每次调用函数时python都会创建一个新的引用,因此更改不会被转移。

答案 1 :(得分:0)

内置类型的对象(int,float,bool,str,tuple,unicode)是不可变的。像(list,set,dict)这样的内置类型的对象是可变的。自定义类通常是可变的。

当您需要更改对象,示例列表,字典等大小时,可以使用可变对象。当您需要确保所创建的对象始终保持不变时,可以使用不可变对象。可变对象基本上是“改变”是昂贵的,因为这样做涉及创建副本。改变可变对象很便宜。