Python交换方法不起作用

时间:2017-07-03 07:03:25

标签: python sorting swap

我正在尝试为pothon做一个冒泡排序方法,只是为了poops和grins。我不认为我的交换方法有效。

def bubbleSort(list):
length = len(list)
for i in range(length - 1):
    if list[i] > list[i+1]:
        #swap
        swap(list[i], list[i+1])
        print(list)
print(list)

def swap(s1, s2):
    # assert type(s1) == list and type(s2) == list
    # tmp = s1[:]
    # s1[:] = s2
    # s2[:] = tmp
    s2, s1 = s1, s2

该程序吐出我的列表,但没有任何时间改变,这告诉我我的交换方法不起作用。

1 个答案:

答案 0 :(得分:4)

  

如果将不可变参数(如整数,字符串或元组)传递给函数,则传递的作用类似于call-by-value。对象引用传递给函数参数。它们不能在函数内更改,因为它们根本无法更改,即它们是不可变的。如果我们传递可变参数,那就不一样了。它们也通过对象引用传递,但它们可以在函数中就地更改。如果我们将一个列表传递给一个函数,我们必须考虑两种情况:列表的元素可以就地改变,即即使在调用者的范围内也会改变列表。如果为名称分配了新列表,则旧列表不会受到影响,即调用者范围中的列表将保持不变。

严格地说,在您的示例中将列表元素传递给swap函数,将无法生效。虽然有python语法允许你直接写这个:

list[i], list[i+1] = list[i+1], list[i]

不确定将这种微小的逻辑提取到单独的函数中的目的是什么。

PS。要详细了解评估策略,例如按值调用,按引用调用以及为何不同,您可以查看wiki

PPS。正如评论中正确指出的那样,python的常见评估策略是“Call-by-Sharing”,例如:

  

通过共享调用(也称为对象调用或通过对象共享调用)是一种评估策略,首先由Barbara Liskov等人命名。对于1974年的CLU语言。[5]它被Python,[6] Iota,[7] Java(用于对象引用),Ruby,JavaScript,Scheme,OCaml,AppleScript等许多语言所使用。但是,“共享呼叫”一词并不常用;不同来源的术语不一致。例如,在Java社区中,他们说Java是按值调用的。[8]通过共享调用意味着语言中的值基于对象而不是基本类型,即所有值都是“盒装”。