鱼C论坛

 找回密码
 立即注册
查看: 1612|回复: 3

[已解决]关于传入不可变类型和可变类型实参,以下总结和举例是否正确,请大神指点

[复制链接]
发表于 2023-6-2 10:24:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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、若传入实参为列表/字典等可变类型(属于容器类型)时,,在函数内部进行修改会影响到原始实参的值

(举例略)


最佳答案
2023-6-2 10:28:33
是的,你的总结基本上是正确的。以下是对你总结内容的一些额外注释和建议:

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  函数将一个新元素添加到了列表中。由于列表是可变类型,这个改变影响到了函数外部的原始列表。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-2 10:28:33 | 显示全部楼层    本楼为最佳答案   
是的,你的总结基本上是正确的。以下是对你总结内容的一些额外注释和建议:

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  函数将一个新元素添加到了列表中。由于列表是可变类型,这个改变影响到了函数外部的原始列表。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-2 12:05:38 | 显示全部楼层
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']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-2 12:07:57 | 显示全部楼层
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'。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 23:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表