【问题标题】:Python - Function parameter value changingPython - 函数参数值变化
【发布时间】:2013-11-05 12:54:25
【问题描述】:

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

【问题讨论】:

    标签: python function parameters


    【解决方案1】:

    当你这样做时

    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)
    

    将打印两个不同的地址。

    【讨论】:

    • 非常感谢,我已经花了好几个小时试图解决这个问题,但它太小了。
    • @user2956299 我很高兴能帮上忙。如果它对您有帮助,请考虑支持并接受这个答案meta.stackexchange.com/a/5235/235416
    【解决方案2】:

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

    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() 可以替换为[:]

    【讨论】:

      猜你喜欢
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 2020-07-05
      • 2017-02-23
      • 2023-03-09
      • 2021-06-03
      • 2014-03-01
      相关资源
      最近更新 更多