Python - 函数参数值更改

时间:2013-11-05 12:54:26

标签: python function parameters

我是Python的新手,我在尝试编写替换函数时遇到了麻烦。目的是显示一个列表,然后显示一个字符被更改的相同列表。

用于调用该函数的代码是:

str_list = ['s', 'h', 'r', 'u', 'g', 'g', 'e', 'd']

print("\nreplace Test")
new_str = list_function.replace(str_list, 'g', 'z')
print(list_function.to_string(str_list))
print(list_function.to_string(new_str))

new_str = list_function.replace(str_list, 'a', 'y')
print(list_function.to_string(new_str))

定义该功能的代码是:

def replace(my_list, old_value, new_value):
    new_list = my_list
    for k in range(0, length(new_list)):
        if new_list[k] == old_value:
            new_list[k] = new_value
    return my_list

但是当我运行程序时,输出是:

replace Test
s, h, r, u, z, z, e, d
s, h, r, u, z, z, e, d
s, h, r, u, z, z, e, d

我只想改变第二个列表,我运行调试器并发现str_list正在改变new_list,但我无法解决我的问题。我做错了。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

当你做

new_list = my_list

您没有复制列表,而是将引用分配给新变量。你需要的是

new_list = my_list[:]

my_list[:]实际上在内存中创建了一个新副本。通过该更改,程序生成

replace Test
s, h, r, u, g, g, e, d
s, h, r, u, g, g, e, d
s, h, r, u, g, g, e, d

您可以在CPython中使用id确认是否创建了新副本。

new_list = my_list
print id(new_list), id(my_list)

将两次打印相同的地址,这意味着它们都指向同一个元素。

new_list = my_list[:]
print id(new_list), id(my_list)

将打印两个不同的地址。

答案 1 :(得分:0)

了解差异的最佳方法是举一些例子。

a = []
b = []

id(a)==id(b)
#False

a = []
b = a

id(a)==id(b)
#True

id函数只返回对象的唯一id或对象的内存地址。

现在要创建一个包含a元素但具有不同id元素的列表,您可以执行以下操作:

a = [1,2,3,4,5]
#Both works
b = list(a) 
b = a[:]

id(a)==id(b)
#False

list()适用于生成器,[:]不适用。 list()将根据给定的顺序构建一个新列表。大部分时间list()可以由[:]替换。