为什么我的函数调用会影响我在参数中发送的变量?

时间:2014-05-29 23:24:31

标签: python

因此,作为/r/dailyprogrammer's在新编程语言中尝试一些简单任务的挑战的一部分,我尝试了Python之后只是略微涉足它。

我必须在Python中重新创建一个Bubble-Sort,这就是我想出来的:

def bubble(unsorted):
    length = len(unsorted)
    isSorted = False
    while not isSorted:
        isSorted = True
        for i in range(0, length-1):
            if(unsorted[i] > unsorted[i+1]):
                isSorted = False
                holder = unsorted[i]
                unsorted[i] = unsorted[i+1]
                unsorted[i+1] = holder

myList = [5,6,4,2,10,1]

bubble(myList)
print myList

现在,就我所知,这段代码完美无瑕,这正是问题所在。我无法弄清楚为什么 bubble 函数会影响变量 myList ,而不会向其返回任何内容或重新设置它。

这真让我烦恼,但它可能是一个python类型的东西:)那我或者我确实是一个非常愚蠢的人。

2 个答案:

答案 0 :(得分:2)

我不确定混淆的原因是什么,但是如果你认为每次编写func(obj)时整个对象都被复制到堆栈中,那你就错了。

除了诸如数字之类的基本类型之外的所有参数都通过引用传递。这意味着在执行函数后可以更新对象的成员或数组元素。

写一个简单的编程确认:

>>> a=[1]
>>> def f(x):
...     x[0]=2
... 
>>> f(a)
>>> print a[0]
2

我希望它能澄清一下。

对于原始类型,您会得到不同的结果:

>>> i=1
>>> def f(x):
...     x=2
... 
>>> f(i)
>>> print i
1
>>> 

答案 1 :(得分:1)

答案是unsortedmyList指向同一个对象,它们不是副本。因此,当你改变一个你改变另一个。您可以找到它的可视化here