python中函数的不同行为

2024-04-20 08:48:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我学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

为什么变量my_list在没有属性的情况下被修改,而my_string值在update_string()函数之后保持不变?我不明白那个机制,你能给我解释一下吗?你知道吗


Tags: 代码newinputstringlenreturn属性my
1条回答
网友
1楼 · 发布于 2024-04-20 08:48:36

函数的行为没有什么不同。不同的是,其中一个名字叫:

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

相关问题 更多 >