最后,我得到了一个在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处理列表和变量有什么区别?
为什么这在列表中有用,而不是变量。 ?
提前感谢您的任何帮助或潜在客户。
答案 0 :(得分:0)
列表是可变的,因此python可以在每次调用函数时在列表中进行更改。因此,更改将被转移。
但是整数不是可变的,因此每次调用函数时python都会创建一个新的引用,因此更改不会被转移。
答案 1 :(得分:0)
内置类型的对象(int,float,bool,str,tuple,unicode)是不可变的。像(list,set,dict)这样的内置类型的对象是可变的。自定义类通常是可变的。
当您需要更改对象,示例列表,字典等大小时,可以使用可变对象。当您需要确保所创建的对象始终保持不变时,可以使用不可变对象。可变对象基本上是“改变”是昂贵的,因为这样做涉及创建副本。改变可变对象很便宜。