gpt4 book ai didi

python - python中函数的不同行为

转载 作者:太空宇宙 更新时间:2023-11-04 00:56:50 26 4
gpt4 key购买 nike

我学习 python 已经有一段时间了,但它总是让我感到惊讶。
我有以下代码:

def update_list(input_list):
input_list.append(len(input_list))
input_list[0] = 11
return input_list

def update_string(input_string):
input_string = 'NEW'
return input_string


my_list = [0,1,2]

print my_list
print update_list(my_list)
print my_list


my_string = 'OLD'

print my_string
print update_string(my_string)
print my_string

此代码提供以下输出:

[0, 1, 2]
[11, 1, 2, 3]
[11, 1, 2, 3]
OLD
NEW
OLD

为什么在update_string() 函数后,变量my_list 被无归属地修改,my_string 值保持不变?我不明白那个机制,你能给我解释一下吗?

最佳答案

函数的行为没有什么不同。不同之处在于,在其中一个中,您反弹了名字:

input_string = 'NEW'

这会将名称 input_string 设置为一个新对象。在另一个函数中,您不对名称进行任何分配。您只需对对象 调用一个方法,并分配给对象的索引。这恰好改变了对象内容:

input_list.append(len(input_list))
input_list[0] = 11

请注意,分配给索引与分配给名称不同。您可以先将列表对象分配给另一个名称,然后单独进行索引分配,什么都不会改变:

_temp = input_list
_temp[0] = 11

因为分配给索引会改变列表中包含的一个元素,而不是您用来引用列表的名称。

如果您直接分配给 input_list,您会看到相同的行为:

input_list = []
input_list.append(len(input_list))
input_list[0] = 11

您也可以在函数外执行此操作:

>>> a_str = 'OLD'
>>> b_str = a_str
>>> b_str = 'NEW'
>>> a_list = ['foo', 'bar', 'baz']
>>> b_list = a_list
>>> b_list.append('NEW')
>>> b_list[0] = 11
>>> a_str
'OLD'
>>> b_str
'NEW'
>>> a_list
[11, 'bar', 'baz', 'NEW']
>>> b_list
[11, 'bar', 'baz', 'NEW']

b_strb_list 的初始赋值正是您调用函数时发生的事情;函数的参数被分配给您传递给函数的值。赋值不会创建副本,它们会创建对该对象的附加引用。

如果您想传入列表对象的副本,请创建一个副本:

new_list = old_list[:]  # slicing from start to end creates a shallow copy

关于python - python中函数的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com