2

我对 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,但我无法弄清楚我做错了什么。任何帮助将不胜感激。

4

2 回答 2

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

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

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

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

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

将打印两个不同的地址。

于 2013-11-05T12:55:42.300 回答
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()可以替换为[:].

于 2013-11-05T13:02:35.800 回答