鱼C论坛

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

[已解决]关于自定义函数调用外部参数的问题

[复制链接]
发表于 2020-3-22 01:10:26 | 显示全部楼层 |阅读模式

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

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

x
为什么自定义函数时,可以不用声明,直接调用外部的 如列表,词典 等“变量”(实体对象?)
而不能直接调用外部的如 str,int格式的变量

能具体说明这两种对于函数内外部调用,之间的差异么
如果我简单把他们都理解为变量,一种能调用,一种不能调用,显然不对。
最佳答案
2020-3-22 02:21:38
本帖最后由 sunrise085 于 2020-3-22 02:24 编辑

python编程语言,尽量的避免复杂化
像int、float、str等类型是一类不可变类型,所谓不可变类型,就是定义即赋值,修改实际上是新的定义,这一类变量的定义和修改都是使用赋值运算符'='。
像list、set、dict等类型是一类可变类型,所谓可变类型,就是定义之后,还可以对变量进行修改,修改前后,该变量的id不变,这一类变量定义使用赋值运算符,修改则需要下标,还可以有插入、删除等操作。

为什么在函数中使用全局变量的时候,不可变类型需要使用关键字global,而可变类型不需要关键字global呢?
首先python中,变量有作用域的区别,有些仅仅在函数内部有效,在函数外是无效的。
对于不可变类型的变量,若是在函数内部进行修改的话,会有歧义,无法识别到底是修改同名的全局变量,还是定义一个同名的局部变量(因为修改和定义方式是一样的)。因此在函数内若使用不可变类型的全局变量时需要使用global进行明确指出。
对于可变类型,则不存在这种歧义,若是在函数内部修改一个与全局变量同名的变量,不会被认为是要创建一个同名的局部变量(因为修改和定义方式是不一样的),当在函数内没有定义一个与全局变量同名的局部变量,那么修改一个同名的变量时,能够明确就是修改全局变量。因此在函数内若使用一个可变类型的全局变量时不需要使用global明确指出。

当然,在函数中仍然可以定义一个同名的可变类型的局部变量,这要在函数内第一次使用该变量之前定义,否则就会出错。
list1=['a','b','c']
def func(x):
    
    list1[0]='f'  #这里已经使用过全局变量了,在函数内就不能再定义同名的局部变量了
    print('下面打算定义一个与全局变量同名的局部变量:')
    list1=['s']  #这里定义同名的变量,会报错


def func2():
    list1=[123,'abc']   #这里定义了一个与全局变量同名的局部变量
    list1.append('123') #这里使用的也是局部变量

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-22 01:53:03 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2020-3-22 02:33 编辑

能调用和不能调用???你想说的应该是函数内部可以改变列表字典之类的全局变量,却不能不经过global声明直接改变值为str和int等类型的全局变量吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 02:21:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-3-22 02:24 编辑

python编程语言,尽量的避免复杂化
像int、float、str等类型是一类不可变类型,所谓不可变类型,就是定义即赋值,修改实际上是新的定义,这一类变量的定义和修改都是使用赋值运算符'='。
像list、set、dict等类型是一类可变类型,所谓可变类型,就是定义之后,还可以对变量进行修改,修改前后,该变量的id不变,这一类变量定义使用赋值运算符,修改则需要下标,还可以有插入、删除等操作。

为什么在函数中使用全局变量的时候,不可变类型需要使用关键字global,而可变类型不需要关键字global呢?
首先python中,变量有作用域的区别,有些仅仅在函数内部有效,在函数外是无效的。
对于不可变类型的变量,若是在函数内部进行修改的话,会有歧义,无法识别到底是修改同名的全局变量,还是定义一个同名的局部变量(因为修改和定义方式是一样的)。因此在函数内若使用不可变类型的全局变量时需要使用global进行明确指出。
对于可变类型,则不存在这种歧义,若是在函数内部修改一个与全局变量同名的变量,不会被认为是要创建一个同名的局部变量(因为修改和定义方式是不一样的),当在函数内没有定义一个与全局变量同名的局部变量,那么修改一个同名的变量时,能够明确就是修改全局变量。因此在函数内若使用一个可变类型的全局变量时不需要使用global明确指出。

当然,在函数中仍然可以定义一个同名的可变类型的局部变量,这要在函数内第一次使用该变量之前定义,否则就会出错。
list1=['a','b','c']
def func(x):
    
    list1[0]='f'  #这里已经使用过全局变量了,在函数内就不能再定义同名的局部变量了
    print('下面打算定义一个与全局变量同名的局部变量:')
    list1=['s']  #这里定义同名的变量,会报错


def func2():
    list1=[123,'abc']   #这里定义了一个与全局变量同名的局部变量
    list1.append('123') #这里使用的也是局部变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 09:56:20 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2020-3-22 10:01 编辑

      在 Python 语言中,变量必须先定义然后才能使用,而定义变量的操作又是通过赋值来进行。在函数的范围内,在没有任何声明的情况下,如果有一个变量未经赋值就直接被访问,那么,这个变量应该是一个外部变量,如果先被赋值,后被访问,那就属于一个典型的局部变量。外部变量在函数中是只读的,就是说,不能出现在赋值语句等号的左边。但是,如果外部变量是一个可变对象,例如,列表、字典等,那么,通过对象的方法来改变对象的内容是完全可以的。当然,如果在函数中事先使用 global、nonlocal 关键字对变量进行过声明,那么,相关外部变量就不再属于只读变量,并且,允许出现在赋值语句中,等号的左边。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 13:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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