我是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
,但我无法解决我的问题。我做错了。任何帮助将不胜感激。
答案 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()
可以由[:]
替换。