我正在尝试为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
该程序吐出我的列表,但没有任何时间改变,这告诉我我的交换方法不起作用。
答案 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]通过共享调用意味着语言中的值基于对象而不是基本类型,即所有值都是“盒装”。