关于传入不可变类型和可变类型实参,以下总结和举例是否正确,请大神指点
1、若传入实参为整数/浮点数/布尔值/字符串等不可变类型以及元组(容器类型但属于不可变类型)时,在函数内部进行修改不会影响到原始实参的值以上虽为不可变类型但可通过用return返回值或使用global关键字修改实参,举例如下:
---用return返回值:
def foo(x):
x = x + (4,)
return(x)
>>> t = (1, 2, 3)
>>> foo(t)
(1, 2, 3, 4)
>>> t = foo(t)
>>> print(t)
(1, 2, 3, 4)
---使用global关键字:
def foo():
global t
t = t + (4,)
>>> t = (1, 2, 3)
>>> foo()
>>> print(t)
(1, 2, 3, 4)
>>> result = foo()
>>> result
>>> print(result)
None
2、若传入实参为列表/字典等可变类型(属于容器类型)时,,在函数内部进行修改会影响到原始实参的值
(举例略)
是的,你的总结基本上是正确的。以下是对你总结内容的一些额外注释和建议:
1. 你正确地理解了不可变类型和可变类型的概念。不可变类型包括:整数、浮点数、布尔值、字符串和元组。如果你在函数中试图改变这些类型的值,那么这个改变只会在函数的局部作用域内有效,不会影响函数外部的原始值。而对于可变类型,如列表和字典,在函数中的任何改变都会影响到原始值。
2. 对于你提到的使用return返回值或global关键字来修改不可变类型的值,这样确实是可以的,但需要注意:
· 使用return并不是真的在原地修改了不可变类型的值,而是创建了一个新的值并将其返回。你需要将函数的返回值重新赋给原始变量,才能在函数外部看到改变。
· 使用global关键字确实可以在函数内部修改全局变量的值,但这通常不是一个好的编程习惯。过度使用全局变量可能导致代码难以理解和维护。在可能的情况下,最好避免使用全局变量,尤其是在复杂的程序中。
3. 对于可变类型,你的理解也是正确的。如果你在函数内部改变了一个可变类型的值,那么这个改变会影响到函数外部的原始值。这是因为在函数内部,你其实是通过引用操作原始对象,而不是操作它的副本。
关于你略过的例子,我提供一个修改列表元素的例子,以便更好地理解:
def modify_list(lst):
lst.append('new element')
original_lst = ['element1', 'element2']
modify_list(original_lst)
print(original_lst)# 输出:['element1', 'element2', 'new element']
在这个例子中, modify_list函数将一个新元素添加到了列表中。由于列表是可变类型,这个改变影响到了函数外部的原始列表。 isdkz 发表于 2023-6-2 10:28
是的,你的总结基本上是正确的。以下是对你总结内容的一些额外注释和建议:
1. 你正确地理解了不可变类 ...
为何输出的结果出现两个'new element'???
>>> def modify_list(lst):
lst.append('new element')
>>> original_list = ['element1', 'element2']
>>> modify_list(lst)
Traceback (most recent call last):
File "<pyshell#104>", line 1, in <module>
modify_list(lst)
NameError: name 'lst' is not defined
>>> modify_list(original_list)
>>> result = modify_list(original_list)
>>> print(result)
None
>>> print(original_list)
['element1', 'element2', 'new element', 'new element'] lzb1001 发表于 2023-6-2 12:05
为何输出的结果出现两个'new element'???
>>> def modify_list(lst):
你的original_list被修改了两次,所以出现了两个 'new element'。具体步骤如下:
1. 首先,你调用modify_list(original_list) ,这将 'new element' 添加到original_list 。
2. 然后,你再次调用result = modify_list(original_list) 。这将 'new element' 再次添加到original_list 。
所以,当你打印original_list时,你看到了两个 'new element'。
同时,注意到modify_list函数没有返回值(默认为None ),所以当你打印result时,输出为None 。
如果你只想在original_list中添加一次 'new element',那么你应该只调用modify_list(original_list)一次。例如:
original_list = ['element1', 'element2']
modify_list(original_list)
print(original_list)# 输出:['element1', 'element2', 'new element']
这样, original_list只会被修改一次,所以只有一个 'new element'。
页:
[1]